在WPF应用程序中设置全局文化(en-IN)

Var*_*ain 26 c# wpf cultureinfo currentuiculture

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

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

上面的代码是在调用Window - InitializeComponent方法之前设置的.

这仍然是在所有TextBox中显示$作为CurrencySymbol.

如果我将TextBox绑定如下,则显示"Rs".作为CurrencySymbol:

Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-IN");
Run Code Online (Sandbox Code Playgroud)

ean*_*son 42

我想你需要添加以下内容.

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)));
Run Code Online (Sandbox Code Playgroud)

在这里阅读更多:

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)));
}
Run Code Online (Sandbox Code Playgroud)

  • 请注意,`CultureInfo.CurrentCulture.IetfLanguageTag`被弃用:_"此属性和GetCultureInfoByIetfLanguageTag方法已过时相反,你应该使用的CultureInfo.Name财产IETF标记和名称是相同的." _.你可能应该使用`CultureInfo.Name`代替. (8认同)
  • 使用 `CultureInfo.CurrentCulture.IetfLanguageTag` 始终使用 Microsoft 对给定文化的默认值,并完全忽略用户所做的更改。例如,在德国,默认日期格式是“dd.mm.yyyy”,但我手动将其配置为符合 ISO 8601:“yyyy-mm-dd”,但大部分时间在 WPF 应用程序中都被忽略(一些特殊控件,例如xceeds Grid 表现不同/更智能)。 (2认同)

Ben*_*ert 10

对我来说,只要工作,如果我将此代码放入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);
      }
}
Run Code Online (Sandbox Code Playgroud)


Cha*_*thJ 5

Thread.CurrentThread.CurrentCulture = 
    System.Globalization.CultureInfo.GetCultureInfo("en-IN");

FrameworkElement.LanguageProperty.OverrideMetadata(typeof(FrameworkElement),
 new FrameworkPropertyMetadata(XmlLanguage.GetLanguage(CultureInfo.CurrentCulture.IetfLanguageTag)));
Run Code Online (Sandbox Code Playgroud)

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

this.Language = XmlLanguage.GetLanguage(CultureInfo.CurrentCulture.IetfLanguageTag);
Run Code Online (Sandbox Code Playgroud)

所有WPF元素都包含可以分配的语言属性,并确定用于格式化的Culture.

参考