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实例的失败是无关紧要的,因为随附的Startup代码从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的首选方法是什么,例如从类的静态属性获取的单例,特别是当所述类缺少公共构造函数时?
答案 0 :(得分:3)
而不是定义StaticResource,你在绑定中引用CultureInfo.CurrentCulture时尝试过x:Static标记扩展吗?
http://msdn.microsoft.com/en-us/library/ms742135.aspx
类似的东西:
... {Binding ... ConverterCulture={x:Static glob:CultureInfo.CurrentCulture}}
或者,this answer或this answer可能会为您的情况提供更好的选择。
答案 1 :(得分:0)
可能没有必要在XAML中定义资源。
base.OnStartup(e);
Resources.Add("CurrentCulture", CultureInfo.CurrentCulture);