31

インドを拠点とするアプリケーションがあり、Cultureを次のように設定しています。

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

上記のコードは、Window.InitializeComponent()メソッドが呼び出される前に呼び出されます。

それでも、これは$すべてのTextBoxで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)));

これにより、アプリケーション全体のデフォルト言語が切り替わります。この設定はアプリケーションごとに1回しか適用できないため、これはスタートアップコードでのみ使用する必要があります。以下のように、必要に応じて個々のフォームを上書きすることもできます

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 に答える