31

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

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

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

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

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

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

6 回答 6

51

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

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.DefaultCulture和。UserSettings.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)));
}
于 2011-09-17T10:22:56.217 回答
15

对我来说,如果我把这段代码放到 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);
      }
}
于 2018-02-05T19:26:23.720 回答
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 元素都包含一个可以分配并确定用于格式化的文化的语言属性。

参考

于 2011-09-17T10:21:59.493 回答
1

对我来说,这很有效,但为了解决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)
       ...;        
  }
}
于 2019-12-04T05:42:48.113 回答
0

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

FrameworkElement.LanguageProperty.OverrideMetadata(typeof(FrameworkElement), new FrameworkPropertyMetadata(
            
XmlLanguage.GetLanguage(CultureInfo.CurrentCulture.IetfLanguageTag)));
于 2020-06-29T12:52:03.927 回答
0

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

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

请记住需要单引号。

于 2021-09-03T17:06:27.190 回答