2011-02-02 276 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

回答