【问题标题】:How to create a StaticResource for a class without public constructors如何为没有公共构造函数的类创建静态资源
【发布时间】:2012-12-20 18:31:58
【问题描述】:

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

【问题讨论】:

    标签: wpf xaml binding


    【解决方案1】:

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

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

    类似:

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

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

    【讨论】:

    • 啊哈x:静态。我知道有一种方法可以做到这一点,我以前用过,但我这辈子都不记得你是怎么做的了。非常感谢你唤起了我的记忆。
    • 但是是否可以将其分配为 ResourceDictionairy 中的资源?即伪代码:&lt;glob:CultureInfo x:Key="CurrentCulture"&gt; &lt;x:Static glob:CultureInfo.CurrentCulture /&gt; &lt;/glob:CultureInfo&gt;
    【解决方案2】:

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

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

    【讨论】:

    • 你的代码完全和我的一样。唯一不同的是我使用了索引器,而你直接调用了 Add 方法。 XAML 的目的是允许其他标记在设计时解析静态资源,正如问题中明确指出的那样。
    • 如果您担心设计时间,您可以使用类似这样的类 DesignTimeCultureInfo : System.Globalization.CultureInfo { public DesignTimeCultureInfo() : base("en-US") { } }
    • 不错的主意,尽管我现在采用了不同的方式,让代码在 DOM 中对所有绑定进行文化修正,因为这与 Visual Studio 设计器绑定编辑器更兼容。
    猜你喜欢
    • 2015-09-26
    • 2021-07-20
    • 2011-03-01
    • 1970-01-01
    • 2020-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多