C# 在WPF应用程序中全局设置区域性(en-IN)

C# 在WPF应用程序中全局设置区域性(en-IN),c#,wpf,cultureinfo,currentuiculture,C#,Wpf,Cultureinfo,Currentuiculture,我有一个基于印度的应用程序,我将文化设置为: Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-IN"); 在调用窗口之前调用上述代码。InitializeComponent()方法 这仍然在所有文本框中将$显示为CurrencySymbol 如果我按如下方式绑定文本框,它将Rs.显示为CurrencySymbol: Text="{Binding Salary,Mode=TwoWay,StringFormat=C,Conve

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

Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-IN");
在调用
窗口之前调用上述代码。InitializeComponent()
方法

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

如果我按如下方式绑定文本框,它将
Rs.
显示为CurrencySymbol:

Text="{Binding Salary,Mode=TwoWay,StringFormat=C,ConvertCulture=en-IN}".
这将切换整个应用程序的默认语言。您只希望在启动代码中使用此设置,因为此设置只能在每个应用程序中应用一次。如有必要,您仍然可以覆盖各个表单,如下所示

this.Language = XmlLanguage.GetLanguage(CultureInfo.CurrentCulture.IetfLanguageTag);
所有WPF元素都包含一个可以分配和 确定用于格式化的区域性


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

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)));
在此处阅读更多信息:

举个例子,这是我如何根据用户设置在程序中初始化区域性的,但是您可以简单地用所需的区域性替换
UserSettings.DefaultCulture
UserSettings.Default.ui

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)));
}

对于我来说,如果我将此代码放在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);
      }
}

对我来说,这是可行的,但为了解决
ToString
问题并使其在整个应用程序中正常运行,重要的是在构造函数中添加它,而不是在启动时添加它,在设置服务容器等之前,否则它在后续线程中不起作用,并且
CultureInfo.CurrentUICulture
仍然解析为默认系统
CultureInfo

公共类应用程序:应用程序
{
公共应用程序()
{     
var culture=新文化信息(“en-IN”);
CultureInfo.DefaultThreadCurrentCulture=区域性;
CultureInfo.DefaultThreadCurrentUICulture=区域性;
FrameworkElement.LanguageProperty.OverrideMetata(
类型(框架元件),
新的FrameworkPropertyMetadata(XmlLanguage.GetLanguage(culture.IetfLanguageTag));
//应该在这之前
var host=host
.CreateDefaultBuilder()
.ConfigureServices(配置服务)
...;        
}
}

对于我的datagrid数据,我在App.xaml.cs的代码行下面使用了它&它起作用了。。 对于de-it显示点,En-it显示4位数字的逗号

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

还要记住:谢谢。我缺少以下代码行。FrameworkElement.LanguageProperty.OverrideMetadata(typeof(FrameworkElement),new FrameworkPropertyMetadata(XmlLanguage.GetLanguage(CultureInfo.CurrentCulture.IETFlangGuageTag));这段代码实际上是做什么的?看看我的文章,它对这个问题有很好的描述。使用
CultureInfo.CurrentCulture.IetfLanguageTag
始终使用Microsoft对给定区域性的默认值,并完全忽略用户所做的更改。例如,在德国这里,默认日期格式为'dd.mm.yyyy',但我手动将其配置为符合ISO 8601:'yyyy-mm-dd',但这在WPF应用程序中大部分时间被忽略(某些特殊控件,如xceeds Grid的行为不同/更智能)。请注意,
CultureInfo.CurrentCulture.IetfLanguageTag
不推荐使用:“不推荐使用此属性和GetCultureInfo ByietFlangAgetag方法。相反,您应该在CultureInfo.Name属性中使用。IETF标记和名称是相同的。”。您可能应该使用
CultureInfo.Name
,而不是如图所示。
FrameworkElement.LanguageProperty.OverrideMetadata(typeof(FrameworkElement), new FrameworkPropertyMetadata(
            
XmlLanguage.GetLanguage(CultureInfo.CurrentCulture.IetfLanguageTag)));