原文
WPF Localization Guidance 「Rick StrahlとMichele Leroux Bustamante(2009年6月)」の和訳です。地域設定の実装の参考にしてください。
関連ファイル
厳格に型指定されたResxリソースと結合する
Binding to Strongly-Typed Resx Resources
厳格に型指定されたリソースは、Visual Studio環境の統合された機能です。前に述べたように、厳格に型指定されたリソースは、自動的に作成されます。 プロジェクトに、新しいResxファイルが追加されると、自動的に、リソース・ファイルのような同じ名前のクラスが作成されます。 コード内では、あなたは、単純に、生成されたリソースクラスに生成した静的プロパティのように、厳格に型指定されたリソースに、アクセスすることができます。 例えば、
MessageBox.Show(WpfLocalization.Properties.Resources.HelloWorld);
これは、役に立ちますが、WPFアプリケーションでは、あなたは、おそらく、コードを使用してそれを割り当てる代わりに、宣言的に、XAML要素に値を結合したいと思います。 上で示されたものと、同じリソースに基づいて、あなたは、StaticExtensionマークアップ拡張機能を使用して、簡単に、静的リソースオブジェクトを結合することができます。 StaticExtensionによる結合は、2つの手順が含まれています。
XAMLドキュメントの、あなたのリソースの名前空間/アセンブリを登録します。
xmlns:props="clr-namespace:WpfLocalization.Properties"
リソースをStaticExtensionを使用しているプロパティに結合します。
<Label x:Name="lblResxHelloWorldStrongValue"
content="{x:Static props:Resources.HelloWorld}" />
この予想される展開では、あなたは、WpfLocaliztion.Properties.Resourcesのような、厳格に型指定されたオブジェクトの静的プロパティに結合します。 それは、Resxリソース・ファイル内のリソース・キーと一致します。 Figure 17では、現在のUICultureは、既定の設定カルチャと一致します。(この例では、en-US) そして、それで、リソースは、既定のリソースの設定から取り出されます。 現在のUICultureが、スイスで利用されるドイツ語(de-CH)の場合、Helloキーは、スイスのリソースで塗り潰されます。 Saveキーが、リソース代替システムによって、指定されていないGermanリソースで塗り潰されている間。 Germanリソースが存在しない場合、リソース代替システムは既定のリソースに戻します。そして、そこから、Saveキーを読み込みます。
FIGURE 17:
厳格に型指定されたResxプロパティは、XAMLのx:Static結合を使用して結合します。
厳格に型指定されたリソース・オブジェクトとその静的プロパティにx:Staticが結合している点、- この例では、WpfLocalization.Properties.Resource。 これは、コンパイラが、XAMLのコンパイルの間に、マークアップ拡張機能で、すべての無効な型参照を捕えるので、さらに安全な型です。:
<Label x:Name="lblResxHelloWorldStrongValue"
content="{x:Static props:Resources.HelloWorld}" />
それは、また、文字列以外の値に結合する可能性があります。 それにもかかわらず、Resxファイルに、文字列以外のリソースを、実際に入力するために、すこし混乱します。 どんな、デザイナー・サポートもありません。 しかし、文字列といくつかの知られている画像形式は、ビットマップ、アイコンと一般的なストリームを好みます。 文字列以外のリソース値を作成するために、あなたは、行う必要があります。 Resxファイル内で手動ではなく、Visual Studioのリソース・エディタを通して、ファイルされます。 例えば、幅のための値を追加するために、あなたは、XMLのように、Double型の値をResxファイルに格納することができます。:
<data name="lblHelloWorld.Width" type="System.Double">
<value>20</value>
</data>
これは、厳格に型指定されたリソースクラスで、倍精度実数型のプロパティを生成します。:
public static double lblHelloWorld_Width {
get {
object obj = ResourceManager.GetObject("lblHelloWorld.Width",
resourceCulture);
return ((double)(obj));
}
}
あなたは、続いて、WPFで以下のリソース・エントリを結合することができます。:
<Label content="{x:Static props:Resources.Today}"
Width="{x:Static props:Resources.lblHelloWorld_Width}"
/>
あなたが、結合する値の形式のキーは、あなたが、結合するプロパティの形式と一致する必要があります。 StaticExtensionは、基礎となるプロパティに、直接、結合します。そして、型コンバータには、サポートが全くありません。 先程の例では、Double型の値はResxに格納されます。 そして、厳格に型指定されたプロパティは、ラベル要素のWidthプロパティに結合します。 これは、Doubleのような単純な型のために、十分に簡単だと思われます。 しかし、例えば、MarginとPaddingのための使用されるThicknessオブジェクトのように、より複雑なものは困難です。 XAMLが使用する標準文字列変換は、XMLシリアル化で動作しません。 言い換えると、あなたは、リソースで調整される余白を除く、10のような文字列の値を割り当てることができません。 あなたは、一致していない形式のために、コンパイル時にエラーを手に入れます。
この複雑さのために、x:Staticの文字列以外の値と厳格に型指定されたリソースにアクセスすることは、推奨されません。 しかし、あなたは、次のセクションで説明するカスタム・マークアップ拡張機能で、簡単に問題を回避することができます。