我有一个 .NET 4.0 WPF 应用程序,用户可以在其中更改语言(文化)
我只是让用户选择一种语言,创建相应的 CultureInfo 并设置:
Thread.CurrentThread.CurrentCulture = cultureInfo;
Thread.CurrentThread.CurrentUICulture = cultureInfo;
在 C# 代码中,这工作得很好。然而,在 WPF 控件中,文化仍然是 en-US。例如,这意味着日期将以美国格式显示,而不是适合当前文化的格式。
显然,这不是一个错误。根据 MSDN 以及 StackOverflow 上的几篇博客文章和文章,WPF 语言不会自动遵循当前文化。在您执行以下操作之前,它是 en-US:
FrameworkElement.LanguageProperty.OverrideMetadata(
typeof(FrameworkElement),
new FrameworkPropertyMetadata(
XmlLanguage.GetLanguage(CultureInfo.CurrentUICulture.IetfLanguageTag)));
参见示例wpf 中的 StringFormat 本地化问题 https://stackoverflow.com/questions/520115/stringfomat-localization-problem/520334#520334.
我不完全明白这里发生了什么。似乎所有框架元素上的语言属性都设置为当前文化。无论如何,它有效。我在应用程序启动时执行此操作,现在所有控件都按预期工作,例如日期根据当前文化进行格式化。
但现在的问题是:根据MSDNFrameworkElement.LanguageProperty.OverrideMetadata
只能调用一次。事实上,如果我再次调用它(当用户更改语言时),它会抛出异常。所以我还没有真正解决我的问题。
问题:如何在应用程序生命周期的任何时间多次可靠地更新 WPF 中的区域性?
(我在研究的时候发现了这一点:http://www.nbdtech.com/Blog/archive/2009/03/18/getting-a-wpf-application-to-pick-up-the- Correct-regional.aspx http://www.nbdtech.com/Blog/archive/2009/03/18/getting-a-wpf-application-to-pick-up-the-correct-regional.aspx看来他在那里有一些工作。但是,我无法想象如何在我的应用程序中执行此操作。看来我必须更新所有打开的窗口和控件中的语言并刷新所有现有的绑定等。)