1

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 的首选方法是什么,尤其是当所述类缺少公共构造函数时?

4

2 回答 2

3

在您的绑定中引用 CultureInfo.CurrentCulture 时,您是否尝试过 x:Static 标记扩展,而不是定义静态资源?

http://msdn.microsoft.com/en-us/library/ms742135.aspx

就像是:

... {Binding ... ConverterCulture={x:Static glob:CultureInfo.CurrentCulture}}

或者,这个答案这个答案可能会为您的情况提供更好的选择。

于 2013-01-07T17:09:05.610 回答
0

可能没有必要在 XAML 中定义资源。

base.OnStartup(e);
Resources.Add("CurrentCulture", CultureInfo.CurrentCulture);
于 2013-01-07T12:09:24.850 回答