Home > C# > 目的別資料 > 地域設定

実行時にXAMLリソースへアクセスする、リソース・ディクショナリを使用する

WPFのための地域設定の手引き Localization Guidance for WPF

原文

WPF Localization Guidance 「Rick StrahlとMichele Leroux Bustamante(2009年6月)」の和訳です。
地域設定の実装の参考にしてください。

関連ファイル

実行時にXAMLリソースへアクセスする、リソース・ディクショナリを使用する
Using Resource Dictionaries for Runtime Access to XAML Resources

あなたが、同様に、コードやXAML結合を通してアクセスすることができるリソースを必要とする可能性があるので、 あなたは、同様に、リソース・ディクショナリを使用しているXAMLドキュメントに、非ユーザーインターフェース・リソースを埋め込むことができます。 リソース・ディクショナリは、スタイルを整え、宣言型のコードを割当てるために、WPFで共通です。 しかし、それらは、同様に、どんなリソース値でも格納することができます。 それは、実行時のコードや明確な結合を通してアクセスすることができます。 リソース・ディクショナリは、XAMLで定義されます。 そして、ドキュメントの全ての他のXAMLの内容と一緒に、正しく地域設定されます。 しかし、静的なプロパティ値と異なり、それは、単純に、読込み時間で割り当てられます。 リソース・ディクショナリで定義されるリソースは、実行時にアクセス可能です。

<Window
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"
x:Class="WpfLocalization.SimpleForm"
x:Name="Window"
Title="SimpleForm" 
Width="640" Height="480">
<Window.Resources>

<!-- ページに静的リソースの文字列を埋め込みます。Embedding static resource strings into the page -->

<sys:String x:Key="Ready">Ready</system:String>
<sys:String x:Key="Today">Today</system:String>
<sys:String x:Key="Yesterday">Yesterday</system:String>
</Window.Resources>
			

このリソース・ディクショナリには、3つの文字列の値が含まれています。 それは、ウィンドウの既定のリソース・ディクショナリに組み込まれています。 CLR形式の名前空間は、 XAMLドキュメントから見える必要があります。 例えば、例の中の接頭辞「sys:」は、mscorlibのSystemで有効です。 それは、この名前空間宣言の<Window>要素で定義されています。:

xmlns:sys="clr-namespace:System;assembly=mscorlib"

あなたは、同様に、中心となるXAMLドキュメントを混乱させることを避けるため、外部ファイルにリソースを格納することができます。 これは、あなたが、ドキュメントやアプリケーションで、多くの静的な独立した地域設定文字列を持っている場合、理にかないます。 以下の例では、2つの外部リソース・ディクショナリは、現在のウィンドウのリソース・ディクショナリに結合されます。:

<Window.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="GlobalResources.xaml" />
<ResourceDictionary Source="SimpleFormRes.xaml" />
</ResourceDictionary.MergedDictionaries>
…ここに、多くのリソースがあります。more resources here
</ResourceDictionary>
</Window.Resources>
			

この状況では、リソース・ディクショナリの1つは、外部ファイルGlobalResources.xamlから結合されます。それは、前述のリソース文字列を保持します。:

<ResourceDictionary
x:Name="WpfLocalization.GlobalResources"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:system="clr-namespace:System;assembly=mscorlib">
<system:String x:Key="Ready">Ready</system:String>
<system:String x:Key="Today">Today</system:String>
<system:String x:Key="Yesterday">Yesterday</system:String>
</ResourceDictionary>
			

一旦、リソースがリソース・ディクショナリで宣言される場合、あなたは、コードの中で、これらのリソースにアクセスすることができます。 リソースは、現在のドキュメントからすべての方法で、App.xamlに含まれる要素まで、コンテナ・チェーン上を検索します。 例えば、特定のXAMLドキュメントの背後にあるコードから「Ready」識別子でリソースにアクセスします。あなたは、次のことをすることができます。:

this.StatusBarMainPanel.Content = this.Resources["Ready"] as string;

あなたが、リソース階層構造全体を検索したい場合、FindResource()がより完全です。:

this.StatusbarMainPanel.Content = this.FindResource("Ready") as string;

LocBamlを使用するとき、リソース・ディクショナリのリソースは、残りすべてのXAMLリソースと一緒に地域設定されています。 エントリが、適切なサテライト・アセンブリから読み込まれるように、あるいは、中心となるアセンブリは、現在のスレッドのUICulture設定に基づいています。 この動作は、コード内でResourceManagerや厳格に型指定されたResxリソースを使用することによく似ています。

リソース・ディクショナリは、あなたに、地域設定の別の選択を与えます。 あなたが、LocBamlのXAMLドキュメント・コンテンツを使用する場合、あなたは、他の非静的リソースをどこに格納する必要があるのでしょうか? あなたは、リソース・ディクショナリで、すべての任意のランタイムを読み込んだリソースを保持することができます。 あるいは、あなたは、一緒にXAMLとResxリソースを使用することを表すための、Resxリソースを作成することができます。 あなたが、LocBaml経路を進む場合、整合性がとれた地域設定プロセスを保持するため、XAMLでリソースを保持することが、望ましいです。 選択肢が、LocBamlといくつかのResxを使用して、いくつかのリソースを地域設定します。 あなたが、CSVとそれぞれのResxファイルをローカライズする必要があることを表します。 ミキシングXAMLとResxリソースは、同様に、コンパイル・プロセスを複雑にします。 以後、LocBamlは、すでにResxリソースに含まれる既存のリソース・ファイルに、XAMLリソースを結合しません。 この問題は、LocBamlの地域設定の仕事の流れについて話す、その後のセクションでさらに調べられます。

コードの中でリソース・ディクショナリ・エントリを使用することを除いて、あなたは、同様に、XAML要素に、エントリを結合することができます。:

<TextBlock Text="{StaticResource Today}"></TextBlock>
<TextBlock Text="{StaticResource Ready}"></TextBlock>

あなたが、LocBamlの方法を使用している場合、要素をリソース・ディクショナリ・エントリに結合する必要はほとんどありません。 多くの場所で、再利用される、いくつかの共通テキストがあります。 (例えば、すべてのステータス・バーは、初期の「Ready」の見出しを持っています。)。 共用リソースは、地域設定の努力とエラーを削減することができます。

注意してください。しかしながら、App.xaml内に格納される、リソース・ディクショナリ・エントリにアクセスするとき、かなり重大な了解事項があります。 App.xamlで定義される、このグローバル・リソース・ディクショナリについて考えてみてください。:

<Application.Resources>
<ResourceDictionary x:Uid="ResourceDictionary_1">
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="GlobalResources.xaml" />
</ResourceDictionary.MergedDictionaries> </ResourceDictionary>
</ApplicationResources.Resources>

次に示すコードは、Readyキーにアクセスするために、FindResources()を使用します。:

MessageBox.Show(this.FindResource("Ready") as string);

リソースは、問題無く読み込まれます。 しかし、残念ながら、返される値は、常に、適切な地域設定されたリソースではなく、UICulture設定に関係なく、既定のリソースです。 適切に動作するリソース代替システムのために、あなたは、それぞれのXAMLドキュメントのリソース・セクションに、直接リソースを読み込む必要があります。:

<Window.Resources> 
<ResourceDictionary.MergedDictionaries> 
<ResourceDictionary 
Source="ApplicationResources.xaml" /> 
</ResourceDictionary.MergedDictionaries> 
</ResourceDictionary> 
</Window.Resources>
このエントリーをはてなブックマークに追加

Home PC C# Illustration

Copyright (C) 2011 Horio Kazuhiko(kukekko) All Rights Reserved.
kukekko@gmail.com
ご連絡の際は、お問い合わせページのURLの明記をお願いします。
「掲載内容は私自身の見解であり、所属する組織を代表するものではありません。」