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

时间:2011-09-17 10:16:36

标签: c# wpf mvvm cultureinfo currentuiculture

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

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

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

仍然在所有TextBox中显示$作为CurrencySymbol。

如果我按如下方式绑定TextBox,则会显示“Rs”。作为CurrencySymbol:

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

5 个答案:

答案 0 :(得分:36)

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

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

答案 1 :(得分:9)

对我来说,如果我把这段代码放到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);
      }
}

答案 2 :(得分:5)

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

答案 3 :(得分:0)

这对我来说是可行的,但是为了解决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)
       ...;        
  }
}

答案 4 :(得分:0)

对于我的datagrid数据,我在App.xaml.cs中的代码行下面使用了它,并且有效.. 代表显示点,并显示逗号为4位数字。

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