如何在运行时更改Windows Phone APP语言?

时间:2011-08-04 09:11:11

标签: xaml data-binding windows-phone-7 multilingual

我按照此示例构建了一个多语言应用:How to: Build a Localized Application for Windows Phone

我成功地将资源数据绑定到这样的文本:

<TextBlock x:Name="ApplicationTitle" Text="{Binding Path=MultiLangResources.Mainpage_Welcome, Source={StaticResource MultiLang}}"/>

我尝试更改Thread.CurrentThread.CurrentUICulture,我可以使用代码输出正确的密钥:

ApplicationTitle.Text = LangResource.Mainpage_Welcome;

但是,绑定文本永远不会更新。

如何使绑定文本更新像普通绑定一样?

有没有人可以帮我解决这个问题? 我也尝试过没有运气。

public class MultiLang : INotifyPropertyChanged
{
    public MultiLang()
    {
    }

    private static MLTest.LangResource multiLangResources = new GigapodV2.LangResource();

    public MLTest.LangResource MultiLangResources
    {
        get { return multiLangResources; }
        set
        {
            if (value != multiLangResources)
            {
                multiLangResources = value;
                NotifyPropertyChanged("MultiLangResources");
            }
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    private void NotifyPropertyChanged(string property)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(property));
        }
    }
}

2 个答案:

答案 0 :(得分:4)

可以轻松完成:

Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("ca-ES");
Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("ca-ES");

主要问题是所有已加载的页面上的文本(例如主页,如果您选择语言选择),都需要“手动刷新”。

但这可以通过编程方式轻松完成:

this.btnChangeLanguage.Content = AppResources.Txt_Aceptar;

答案 1 :(得分:3)

LangResource类本身不可观察,因此不会观察到它的任何绑定属性。而且,手机不会因为您即时更改而通知所有与CurrentCulture相关的房产。

以这种方式进行语言更改否则需要重启您的应用。但我建议你小心这一点,因为操作系统本身允许语言交换,这意味着你需要有一个真正好的理由让你的应用程序自己允许它。

解决方案是创建一个包装类,在更改CurrentCulture时通知所有属性它们已更新。使用Simon的NotifyPropertyWeaver [DependsOn]属性可能会让这很容易。