1

WPF バインディングは、CultureInfo.CurrentCulture ではなく CultureInfo.CurrentUICulture を使用します。これは、コントロール パネルの [地域と言語] ダイアログで指定された設定を尊重しないことを意味します。

したがって、WPF アプリケーションでローカリゼーションを適切に実装するには、CurrentCulture をすべてのバインディングの ConverterCulture に何らかの方法で割り当てる必要があります。

これは、App.xaml で宣言された StaticResource を使用して行うのが最適ですが、問題があります。CultureInfo クラスにはパブリック コンストラクターがありません。その結果、このようなマークアップ

<Application x:Class="ScriptedRoutePlayback.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:sys="clr-namespace:System;assembly=mscorlib"
             xmlns:glob="clr-namespace:System.Globalization;assembly=mscorlib"
             StartupUri="MainWindow.xaml">
  <Application.Resources>
    <glob:CultureInfo x:Key="CurrentCulture" />
  </Application.Resources>
</Application>

CultureInfo にパブリック コンストラクターがないという事実に関する警告を生成します。それにもかかわらず、マークアップは適切に型指定された静的リソースをデザイナーが使用する名前空間に登録するのに十分です。これにより、{StaticResource CurrentCulture} へのマークアップ参照がアプリ​​の残りの部分で文句を言うのを防ぎます。

実行時にこのマークアップで CultureInfo のインスタンスを作成できなくても、付随するスタートアップ コードによって CultureInfo.CurrentCulture から割り当てられるため、問題にはなりません。

using System.Globalization;
using System.Windows;

namespace ScriptedRoutePlayback
{
  public partial class App : Application
  {
    protected override void OnStartup(StartupEventArgs e)
    {
      base.OnStartup(e);
      Resources["CurrentCulture"] = CultureInfo.CurrentCulture;
    }
  }
}

最後に、質問:

クラスの静的プロパティから取得されたシングルトンなどの既存のオブジェクトを参照する StaticResource をマークアップするための推奨される方法は何ですか?

4

2 に答える 2

3

StaticResourceを定義する代わりに、バインディングでCultureInfo.CurrentCultureを参照するときにx:Staticマークアップ拡張機能を試しましたか?

http://msdn.microsoft.com/en-us/library/ms742135.aspx

何かのようなもの:

... {Binding ... ConverterCulture={x:Static glob:CultureInfo.CurrentCulture}}

あるいは、この回答またはこの回答は、状況に適した代替案を提供する場合があります。

于 2013-01-07T17:09:05.610 に答える
0

XAML でリソースを定義する意味がないかもしれません。

base.OnStartup(e);
Resources.Add("CurrentCulture", CultureInfo.CurrentCulture);
于 2013-01-07T12:09:24.850 に答える