WPF应用程序中MVVM模式下的本地化

11
如何使用MVVM模式本地化WPF应用程序?我真的想以“正确”的方式做到这一点。 我目前的方法是使用.resx资源文件来本地化我的应用程序。

Solution Explorer VS 2012

我在我的XAML代码中包含了它们。

xmlns:localization="clr-namespace:ClientLibTestTool.ViewLanguages"

并像这样访问它们:
        <Button x:Name="BtnGenerate" 
                Content="{x:Static localization:localization.ButtonGenerate}"/>

我的问题:

  1. 有更好的方法吗?
  2. 如何测试不同语言(使用不同的语言设置加载应用程序)?
  3. 是否可以在运行时更改语言?

答案:

问题1:

问题2:(谢谢,stijn)

public MainWindow()
{
    // Debug Settings
    localization.Culture = CultureInfo.GetCultureInfo("en-US");
    // localization.Culture = CultureInfo.GetCultureInfo("de-DE");
    this.InitializeComponent();
}

问题3:(谢谢,斯坦恩)
不是很必要,需要重新绘制整个窗口。
1个回答

4

在我看来,这是正确的做法。 要切换语言,请更改本地化类使用的区域设置:

localization.Culture = CultureInfo.GetCultureInfo( "de-DE" );

由于所有字符串都是在运行时获取的(生成的Designer.cs文件中的所有调用看起来像ResourceManager.GetString("SomeString", resourceCulture);,而resourceCulture是由上面的调用设置的),这会影响您在运行时获取的内容。然而,假设您在xaml中使用菜单项等值,则必须在此生效之前重新构建整个菜单。


1
备注:这行代码必须在InitializeComponent()方法之前执行。否则它将无法工作。 - Joel
1
这就是我在上一句话中的意思;它仍然可以工作,但只适用于再次引用它的组件。您可以通过不在XAML中使用资源字符串,而是绑定到包含资源值并在更改时触发PropertyChanged事件的可观察属性来解决此问题。 - stijn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接