2011-02-02 4 views
1

디자인 타임 현지화를 구현하려고합니다. Xaml의 창에 적절한 언어로 레이블을 표시하기 위해 레이블을 자동 변경하는 언어 및 언어 컨트롤을 선택하는 속성이 필요합니다.WPF 첨부 된 속성

언어 기호 (예 : LANG_SURNAME 또는 LANG_FORENAME)가 포함 된 LanguageLabel에서 연결된 속성 (LanguageMarkupProperty)의 내용을 검색하여 레이블 텍스트를 조회 한 다음 지정된 언어로 조회합니다. 지금까지 나는 콘텐츠 컨트롤에서 파생 객체를 만들었습니다

public class LanguageLabel : ContentControl 
{ 
    public LanguageLabel() 
    { 
     EventManager.RegisterClassHandler(typeof(Window), 
              DisplayLanguage.LanguageChangedEvent, 
              new RoutedEventHandler(this.ChangeLanguage)); 

     this.Loaded += new RoutedEventHandler(LanguageLabel_Loaded); 
    } 

    ~LanguageLabel() 
    { 
    } 

    // Walk up the visual tree to find the top level object. 
    private DependencyObject FindUpVisualTree(DependencyObject initial) 
    { 
     DependencyObject current = initial; 
     DependencyObject last = current; 

     while (current != null) 
     { 
      last = current; 
      current = VisualTreeHelper.GetParent(current); 
     } 

     return last; 
    } 

    void LanguageLabel_Loaded(object sender, RoutedEventArgs e) 
    { 
     object root = FindUpVisualTree(this); 

     UIElement window = root as UIElement; 
     PossibleLanguages ?language = null; 
     if (window != null) 
      language = (PossibleLanguages)window.GetValue(DisplayLanguage.DisplayLanguageProperty); 
     if (language == null) language = PossibleLanguages.UKEnglish; 

     string languageSymbol = GetValue(LanguageMarkup.LanguageMarkupProperty) as string; 

     this.Content = Language.Translate(languageSymbol, language); 

    } 

    public void ChangeLanguage(object sender, RoutedEventArgs e) 
    { 
     LanguageChangedEventArgs le = e as LanguageChangedEventArgs; 

     string languageSymbol = GetValue(LanguageMarkup.LanguageMarkupProperty) as string; 

     this.Content = Stanley.Language.Translate(languageSymbol, (PossibleLanguages)le.DependencyPropertyChangedEventArgs.NewValue); 
    } 


} 

나는 또한 내가 XAML의 창에 걸었습니다 연결된 속성라는 이름의 표시 언어를 만들었습니다.

public class DisplayLanguage 
{ 
    public static readonly DependencyProperty DisplayLanguageProperty; 

    public static void SetDisplayLanguage(UIElement element, PossibleLanguages value) 
    { 
     element.SetValue(DisplayLanguageProperty, value); 
    } 

    public static PossibleLanguages GetDisplayLanguage(UIElement element) 
    { 
     return (PossibleLanguages)element.GetValue(DisplayLanguageProperty); 
    } 

    static DisplayLanguage() 
    { 
     DisplayLanguageProperty = DependencyProperty.RegisterAttached(
          "DisplayLanguage", 
          typeof(PossibleLanguages), 
          typeof(WindowBase), 
          new FrameworkPropertyMetadata(PossibleLanguages.UKEnglish, FrameworkPropertyMetadataOptions.AffectsRender ,new PropertyChangedCallback(OnDisplayLanguageChanged)) 
          ); 

    } 


    public static void AddReceiver(object receiver, RoutedEventHandler e) 
    { 
    } 

    public static void OnDisplayLanguageChanged(DependencyObject control, DependencyPropertyChangedEventArgs e) 
    { 
     // Fire an event to tell the LanguageLabel controls to update to the new language. 
    } 

} 

내가 이벤트를 발생하는 OnDisplayLanguageChanged 좋아할 어떻게 든 그 모든 언어가 디자인 타임에 자신의 표시를 업데이트 컨트롤을 알려줍니다. 아무도 내가 이것을 어떻게 할 수 있는지 안다?

+0

'디자인 타임 현지화'란 무엇을 의미합니까? – NVM

+0

나는 xaml이 VS IDE에서 렌더링한다는 것을 의미합니다 –

+0

잘못된 키. 다시 시도하십시오. VS2010의 디자인 타임 렌더링은 적절한 언어 변환이 적용된 레이블을 보여줍니다. –

답변

0

모든 언어 제어가 가입 할 수있는 이벤트를 브로드 캐스트하려면 EventAggregator in Prism 또는 Messanger in MVVMLight과 같은 것을 사용할 수 있습니다.

이 프레임 워크를 사용하고 싶지 않은 경우이 패턴을 자체적으로 구현하는 것이 매우 쉽습니다.

+0

로드 할 때 LanguageLabels가 구독하는 이벤트를 사용하여 내 솔루션을 만들었습니다. 치료를해라. –