2011-02-02 174 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引發一個事件在某種程度上,它告訴所有的語言控制在設計時更新其顯示。有誰知道我可以如何acheiev這個?

+0

「設計時間本地化」是什麼意思? – NVM 2011-02-02 16:09:03

+0

我的意思是在VS IDE中的xaml渲染人員 – 2011-02-02 16:34:55

回答