如何为没有公共构造函数的类创建StaticResource

时间:2013-01-07 02:17:20

标签: wpf xaml binding

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的首选方法是什么,例如从类的静态属性获取的单例,特别是当所述类缺少公共构造函数时?

2 个答案:

答案 0 :(得分:3)

而不是定义StaticResource,你在绑定中引用CultureInfo.CurrentCulture时尝试过x:Static标记扩展吗?

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

类似的东西:

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

或者,this answerthis answer可能会为您的情况提供更好的选择。

答案 1 :(得分:0)

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

base.OnStartup(e);
Resources.Add("CurrentCulture", CultureInfo.CurrentCulture);