簡體   English   中英

WPF附加屬性

[英]WPF Attached properties

我試圖實現設計時本地化,我希望Xaml窗口中的一個屬性可以選擇語言和語言控件,這些控件會自動更改其標簽以以適當的語言顯示標簽。

通過在LanguageLabel上檢索包含語言符號(例如LANG_SURNAME或LANG_FORENAME)的附加屬性(LanguageMarkupProperty)的內容來查找標簽文本,然后以指定的語言查找。 到目前為止,我已經創建了一個從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);
    }


}

我還創建了一個名為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.
    }

}

我希望OnDisplayLanguageChanged以某種方式引發一個事件,該事件告訴所有語言控件在設計時更新其顯示。 有誰知道我該怎么做?

您可以使用Prism 中的EventAggregatorMVVMLight中的 Messanger之類的東西來廣播所有語言控件都可以訂閱的事件。

如果您不想使用這些框架,則可以很容易地創建自己的這種模式的實現。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM