【问题标题】:Changing the UI language dynamically动态更改 UI 语言
【发布时间】:2009-12-08 10:03:20
【问题描述】:

我有一个多语言 silverlight 应用程序,其中资源存储在不同语言的 resx 文件中,并绑定到 xaml 内的按钮和标签的内容属性。

在 silverlight 页面的构造函数中设置线程的 UI 文化时,一切正常,但根据用户的选择(通过组合框选择)更改它时 界面没有变化。我需要页面根据新线程的 UI 文化重绘控件并重新绑定到资源文件。

【问题讨论】:

    标签: silverlight localization


    【解决方案1】:

    我不确定您使用什么机制将视图绑定到本地化存储库,但我猜问题出在通知上。

    视图只会在收到通知事件时更新绑定中的数据。最有可能的是,您绑定到的具有本地化数据的对象在文化更改时不会发送通知。

    您可以考虑将 INotifyPropertyChanged 添加到保存本地化字符串的对象中。然后,向该类添加一个名为“NotifyThatEverythingChanged”的方法。在该方法中,只需发送属性 string.Empty 已更改,这会告诉 UI 更新数据上下文中的所有内容。

    就我而言,我有一个名为 MyUIStrings 的 RESX 为我自动生成的对象。它有一堆静态字符串。我从该类派生,并添加功能以通知一切都已更改。 UI 将采取相应措施:

    public class NotifyableUIStrings : MyUIStrings, INotifyPropertyChanged
    {
        public void NotifyThatEverythingChanged()
        {
            OnPropertyChanged(string.Empty);
        }
    
        protected void OnPropertyChanged(string propertyName)
        {
            var handlers = PropertyChanged;
            if(handlers != null)
                handlers(this, new PropertyChangedEventArgs(propertyName));
        }
    
        public event PropertyChangedEventHandler PropertyChanged;
    }
    

    【讨论】:

    • 您能否详细说明您如何在应用程序中使用该类。我试过做同样的事情,但绑定不起作用,我的绑定中的内容是空的。如果我注册“MyUIStrings”而不是通知版本,它工作正常。这是针对 Silverlight 4 的。
    • 实现 NotifyThatEverythingChanged 的​​更简单方法是只执行 OnPropertyChanged(null)。请参阅此处的备注部分:msdn.microsoft.com/en-us/library/…
    • @ArildF:是的。这是正确的。当时并不知道。 String.Empty 也可以 :)
    • @SondreB:我过去做过,在这篇博文中有概述:houseofbilz.com/archives/2009/03/15/…
    • 谢谢,这仍然需要您输入一些额外的内容;-) 我想直接使用生成的资源类并避免使用“String.SearchButton”。我想出了这个我认为效果很好的解决方案:sondreb.com/blog/post/…
    猜你喜欢
    • 2015-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-10
    相关资源
    最近更新 更多