【问题标题】:Setting Culture (en-IN) globally in WPF application在 WPF 应用程序中全局设置 Culture (en-IN)
【发布时间】:2011-11-19 05:18:50
【问题描述】:

我有一个基于印度的应用程序,我将文化设置为:

Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-IN");

上面的代码是在Window.InitializeComponent()方法被调用之前调用的。

这仍然在所有文本框中将 $ 显示为 CurrencySymbol。

如果我按如下方式绑定一个 TextBox,它会将 Rs. 显示为 CurrencySymbol:

Text="{Binding Salary,Mode=TwoWay,StringFormat=C,ConvertCulture=en-IN}".

【问题讨论】:

标签: c# wpf cultureinfo currentuiculture


【解决方案1】:

我认为您需要添加以下内容。

Thread.CurrentThread.CurrentCulture = new CultureInfo("en-IN");
Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-IN");
FrameworkElement.LanguageProperty.OverrideMetadata(typeof(FrameworkElement), new FrameworkPropertyMetadata(
            XmlLanguage.GetLanguage(CultureInfo.CurrentCulture.IetfLanguageTag)));

在此处阅读更多信息:

http://www.west-wind.com/weblog/posts/2009/Jun/14/WPF-Bindings-and-CurrentCulture-Formatting

举个例子,这是我在程序中根据用户设置初始化文化的方式,但您可以简单地将UserSettings.DefaultCultureUserSettings.Default.UICultrue 替换为您想要的文化。

private static void InitializeCultures()
{
    if (!String.IsNullOrEmpty(UserSettings.Default.Culture))
    {
        Thread.CurrentThread.CurrentCulture = new CultureInfo(UserSettings.Default.Culture);
    }
    if (!String.IsNullOrEmpty(UserSettings.Default.UICulture))
    {
        Thread.CurrentThread.CurrentUICulture = new CultureInfo(UserSettings.Default.UICulture);
    }

    FrameworkElement.LanguageProperty.OverrideMetadata(typeof(FrameworkElement), new FrameworkPropertyMetadata(
        XmlLanguage.GetLanguage(CultureInfo.CurrentCulture.IetfLanguageTag)));
}

【讨论】:

  • 谢谢。我错过了以下代码行。 FrameworkElement.LanguageProperty.OverrideMetadata(typeof(FrameworkElement), new FrameworkPropertyMetadata(XmlLanguage.GetLanguage(CultureInfo.CurrentCulture.IetfLanguageTag)));这段代码实际上是做什么的?
  • 看看我包含的文章,它包含了对问题的很好的描述。 west-wind.com/weblog/posts/2009/Jun/14/…
  • 使用 CultureInfo.CurrentCulture.IetfLanguageTag 始终使用 Microsoft 对给定区域性的默认值,并完全忽略用户所做的更改。例如,在德国,默认日期格式为“dd.mm.yyyy”,但我手动将其配置为符合 ISO 8601:“yyyy-mm-dd”,但大多数情况下在 WPF 应用程序中都会忽略这一点(一些特殊控件,如xceeds Grid 表现不同/更智能)。
  • 请注意 CultureInfo.CurrentCulture.IetfLanguageTag 已弃用:"此属性和 GetCultureInfoByIetfLanguageTag 方法已弃用。相反,您应该使用 CultureInfo.Name 属性。IETF 标记和名称是相同的。 ".您可能应该按照说明使用CultureInfo.Name
【解决方案2】:

如果我把这段代码放到 OnStartup 覆盖的方法中,对我来说就可以了:

public partial class App : Application
{
      public App()
      {                
      }

      protected override void OnStartup(StartupEventArgs e)
      {
          var vCulture = new CultureInfo("de-DE");

          Thread.CurrentThread.CurrentCulture = vCulture;
          Thread.CurrentThread.CurrentUICulture = vCulture;
          CultureInfo.DefaultThreadCurrentCulture = vCulture;
          CultureInfo.DefaultThreadCurrentUICulture = vCulture;

          FrameworkElement.LanguageProperty.OverrideMetadata(
          typeof(FrameworkElement),
          new FrameworkPropertyMetadata(                 
       XmlLanguage.GetLanguage(CultureInfo.CurrentCulture.IetfLanguageTag)));

          base.OnStartup(e);
      }
}

【讨论】:

    【解决方案3】:
    Thread.CurrentThread.CurrentCulture = 
        System.Globalization.CultureInfo.GetCultureInfo("en-IN");
    
    FrameworkElement.LanguageProperty.OverrideMetadata(typeof(FrameworkElement),
     new FrameworkPropertyMetadata(XmlLanguage.GetLanguage(CultureInfo.CurrentCulture.IetfLanguageTag)));
    

    这将切换整个应用程序的默认语言。您只想在启动代码中使用此设置,因为此设置只能在每个应用程序中应用一次。您仍然可以在必要时覆盖单个表单,如下所示

    this.Language = XmlLanguage.GetLanguage(CultureInfo.CurrentCulture.IetfLanguageTag);
    

    所有 WPF 元素都包含一个可以分配和 确定用于格式化的文化。

    Reference

    【讨论】:

      【解决方案4】:

      对我来说,这很有效,但为了解决 ToString 并使其在整个应用程序中运行,在设置服务容器等之前将其添加到构造函数中很重要,而不是 OnStartup 等。否则它在后续线程中不起作用,CultureInfo.CurrentUICulture 仍然解析为默认系统CultureInfo

      public class App : Application
      {
        public App() 
        {     
          var culture = new CultureInfo("en-IN");
          CultureInfo.DefaultThreadCurrentCulture = culture;
          CultureInfo.DefaultThreadCurrentUICulture = culture;
      
          FrameworkElement.LanguageProperty.OverrideMetadata(
              typeof(FrameworkElement),
              new FrameworkPropertyMetadata(XmlLanguage.GetLanguage(culture.IetfLanguageTag)));
      
           // should be before all this
           var host = Host
             .CreateDefaultBuilder()
             .ConfigureServices(ConfigureServices)
             ...;        
        }
      }
      

      【讨论】:

        【解决方案5】:

        对于我的数据网格数据,我在 App.xaml.cs 中的代码行下方使用了它,它工作了.. 对于 de 它显示点和 En 它显示 4 位数字的逗号。

        FrameworkElement.LanguageProperty.OverrideMetadata(typeof(FrameworkElement), new FrameworkPropertyMetadata(
                    
        XmlLanguage.GetLanguage(CultureInfo.CurrentCulture.IetfLanguageTag)));
        

        【讨论】:

          【解决方案6】:

          此外,假设您使用的是 TextBlock,还有另一种方法:

          <TextBlock Text="{Binding Salary, Mode=TwoWay, StringFormat='{}{0:C}', ConverterCulture='en-IN'}" />
          

          请记住单引号是必需的。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-10-14
            • 1970-01-01
            • 2010-09-05
            • 1970-01-01
            • 2013-03-14
            • 1970-01-01
            相关资源
            最近更新 更多