WPF 绑定使用 CultureInfo.CurrentUICulture 而不是 CultureInfo.CurrentCulture,这意味着它们不遵守控制面板的区域和语言对话框中指定的首选项。
为了在 WPF 应用程序中正确实现本地化,因此有必要以某种方式将 CurrentCulture 分配给每个绑定的 ConverterCulture。
这最好使用在 App.xaml 中声明的 StaticResource 来完成,但存在一个问题:CultureInfo 类没有公共构造函数。结果,像这样的标记
<Application x:Class="ScriptedRoutePlayback.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:sys="clr-namespace:System;assembly=mscorlib"
xmlns:glob="clr-namespace:System.Globalization;assembly=mscorlib"
StartupUri="MainWindow.xaml">
<Application.Resources>
<glob:CultureInfo x:Key="CurrentCulture" />
</Application.Resources>
</Application>
生成有关 CultureInfo 没有公共构造函数的警告。尽管如此,标记足以在设计者使用的命名空间中注册适当类型的静态资源,从而阻止对 {StaticResource CurrentCulture} 的标记引用在应用程序的其余部分中抱怨。
在运行时,此标记创建 CultureInfo 实例的失败是无关紧要的,因为随附的启动代码从 CultureInfo.CurrentCulture 分配它:
using System.Globalization;
using System.Windows;
namespace ScriptedRoutePlayback
{
public partial class App : Application
{
protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);
Resources["CurrentCulture"] = CultureInfo.CurrentCulture;
}
}
}
最后,问题:
标记引用现有对象(例如从类的静态属性获得的单例)的 StaticResource 的首选方法是什么,尤其是当所述类缺少公共构造函数时?