简体   繁体   English

WPF附加属性

[英]WPF Attached properties

I am trying to implment design time localization I would like a property on the window in Xaml to select the language and language controls that authomatically change their label to show the label in the appropriate language. 我试图实现设计时本地化,我希望Xaml窗口中的一个属性可以选择语言和语言控件,这些控件会自动更改其标签以以适当的语言显示标签。

The text for the label is looked up by retrieveing the contents of an attached property (LanguageMarkupProperty) on the LanguageLabel that contains a language symbol (LANG_SURNAME or LANG_FORENAME for example), this then gets looked up in the specified language. 通过在LanguageLabel上检索包含语言符号(例如LANG_SURNAME或LANG_FORENAME)的附加属性(LanguageMarkupProperty)的内容来查找标签文本,然后以指定的语言查找。 So far I have created an object deriving from Content control: 到目前为止,我已经创建了一个从Content控件派生的对象:

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);
    }


}

I have also created an attached property named display language that I am putting on the Window in Xaml. 我还创建了一个名为display language的附加属性,将其放在Xaml的Window中。

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.
    }

}

I would like OnDisplayLanguageChanged to raise an event somehow that tells all the language controls to update their display at design time. 我希望OnDisplayLanguageChanged以某种方式引发一个事件,该事件告诉所有语言控件在设计时更新其显示。 Does anyone know how I can acheiev this? 有谁知道我该怎么做?

You can use something like EventAggregator in Prism or Messanger in MVVMLight to broadcast an event to which all language controls can subscribe. 您可以使用Prism 中的EventAggregatorMVVMLight中的 Messanger之类的东西来广播所有语言控件都可以订阅的事件。

If you don't want to use these frameworks it is quite easy to create you own implementation of this pattern. 如果您不想使用这些框架,则可以很容易地创建自己的这种模式的实现。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM