Windows Presentation Foundation (WPF) リソースは、マージされたリソース ディクショナリ機能をサポートします。 この機能は、コンパイル済みの XAML アプリケーションの外部で WPF アプリケーションのリソース部分を定義する方法を提供します。 リソースはアプリケーション間で共有でき、ローカライズのためにより便利に分離されます。
マージされたディクショナリを作成する
マークアップでは、次の構文を使用して、マージされたリソース ディクショナリをページに導入します。
<Page.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="myresourcedictionary.xaml"/>
<ResourceDictionary Source="myresourcedictionary2.xaml"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Page.Resources>
ResourceDictionary要素には x:Key ディレクティブがありません。これは通常、リソース コレクション内のすべての項目に必要です。 ただし、ResourceDictionary
コレクション内の別のMergedDictionaries参照は特殊なケースであり、このマージされたリソース ディクショナリ シナリオ用に予約されています。 さらに、マージされたリソース ディクショナリを導入する ResourceDictionary
に x:Key ディレクティブを指定することはできません。
通常、ResourceDictionary コレクション内の各MergedDictionariesは、Source属性を指定します。
Source
の値は、マージするリソース ファイルの場所に解決される URI (Uniform Resource Identifier) である必要があります。 その URI の宛先は、ルート要素として ResourceDictionary
を持つ別の XAML ファイルである必要があります。
注
ResourceDictionaryを指定する代わりに、または指定したソースから含まれるリソースに加えて、マージされたディクショナリとして指定されたSource内でリソースを定義することは有効です。 ただし、これは一般的なシナリオではありません。 マージされたディクショナリの主なシナリオは、外部ファイルの場所からリソースをマージすることです。 ページのマークアップ内でリソースを指定する場合は、マージされたディクショナリではなく、メイン ResourceDictionary
でリソースを定義します。
マージされた辞書の挙動
マージされたディクショナリ内のリソースは、マージ先のメイン リソース ディクショナリのスコープの直後にあるリソース参照スコープ内の場所を占有します。 リソース キーは個々のディクショナリ内で一意である必要がありますが、マージされたディクショナリのセットにキーを複数回存在させることができます。 この場合、返されるリソースは、 MergedDictionaries コレクション内で順番に見つかった最後のディクショナリから取得されます。 MergedDictionaries コレクションが XAML で定義されている場合、コレクション内のマージされたディクショナリの順序は、マークアップで指定された要素の順序になります。 キーがプライマリ ディクショナリとマージされたディクショナリで定義されている場合、返されるリソースはプライマリ ディクショナリから取得されます。 これらのスコープ規則は、静的リソース参照と動的リソース参照の両方に均等に適用されます。
マージされたディクショナリとコード
マージされたディクショナリは、コードを使用して Resources
ディクショナリに追加できます。
ResourceDictionary プロパティに関連付けられた既定のResources
は、最初は空で、また、既定で最初は空のMergedDictionariesコレクションプロパティも持っています。 コードを使用してマージされたディクショナリを追加するには、目的のプライマリ ResourceDictionary
への参照を取得し、そのMergedDictionaries
プロパティ値を取得し、Add
に含まれる汎用Collection
に対してMergedDictionaries
を呼び出します。 追加するオブジェクトは、新しい ResourceDictionary
である必要があります。
コードでは、 Source プロパティは設定しません。 代わりに、 ResourceDictionary
オブジェクトを作成するか、読み込んで取得する必要があります。 既存のResourceDictionary
を読み込んで、XamlReader.Load ルートを持つ既存の XAML ファイル ストリームでResourceDictionary
を呼び出し、戻り値をResourceDictionary
にキャストする方法の 1 つ。
統合されたディクショナリ URI
マージされたリソース ディクショナリを含める方法にはいくつかの手法があります。これは、使用する URI (Uniform Resource Identifier) 形式で示されます。 大まかに言えば、これらの手法は、プロジェクトの一部としてコンパイルされるリソースと、プロジェクトの一部としてコンパイルされていないリソースという 2 つのカテゴリに分けることができます。
プロジェクトの一部としてコンパイルされるリソースの場合は、リソースの場所を参照する相対パスを使用できます。 相対パスはコンパイル時に評価されます。 リソースは、 リソース ビルド アクション としてプロジェクトの一部として定義する必要があります。 リソース .xaml ファイルを リソースとしてプロジェクトに含める場合、リソース ファイルを出力ディレクトリにコピーする必要はありません。リソースはコンパイル済みアプリケーションに既に含まれています。 コンテンツ ビルド アクションを使用することもできますが、ファイルを出力ディレクトリにコピーし、実行可能ファイルと同じパス関係にあるリソース ファイルをデプロイする必要があります。
注
埋め込みリソース のビルド アクションは使用しないでください。 ビルド アクション自体は WPF アプリケーションでサポートされていますが、 Source の解決には ResourceManagerが組み込まれていないため、個々のリソースをストリームから分離することはできません。 を使用してリソースにアクセスしている限り、ResourceManagerリソースを他の目的で使用することもできます。
関連する手法は、XAML ファイルに 対してパック URI を 使用し、 ソースと呼びます。 パック URI を使用すると、参照されるアセンブリとその他の手法のコンポーネントへの参照が可能になります。 パック URI の詳細については、「WPF アプリケーション リソース、コンテンツ、およびデータ ファイル」を参照してください。
プロジェクトの一部としてコンパイルされていないリソースの場合、URI は実行時に評価されます。 ファイルや http: などの一般的な URI トランスポートを使用して、リソース ファイルを参照できます。 コンパイルされていないリソースアプローチを使用する欠点は、 ファイル: アクセスには追加のデプロイ手順が必要であり、 http: アクセスはインターネット セキュリティ ゾーンを意味することです。
マージされたディクショナリの再利用
マージするリソース ディクショナリは任意の有効な UNIFORM Resource Identifier (URI) を介して参照できるため、マージされたリソース ディクショナリをアプリケーション間で再利用または共有できます。 これを行う方法は、アプリケーションのデプロイ戦略と従うアプリケーション モデルによって異なります。 前述のパック URI 戦略は、アセンブリ参照を共有することで、開発時に複数のプロジェクト間でマージされたリソースを一般的にソース化する方法を提供します。 このシナリオでは、リソースは引き続きクライアントによって配布され、少なくとも 1 つのアプリケーションが参照アセンブリをデプロイする必要があります。 http: プロトコルを使用する分散 URI を使用して、マージされたリソースを参照することもできます。
マージされたディクショナリをローカル アプリケーション ファイルとして、またはローカル共有ストレージに書き込むのも、マージされたディクショナリとアプリケーションの展開シナリオとして考えられるもう 1 つのシナリオです。
ローカライゼーション
ローカライズする必要があるリソースが、プライマリ ディクショナリにマージされ、緩い XAML として保持されているディクショナリに分離されている場合、これらのファイルは個別にローカライズできます。 この手法は、サテライト リソース アセンブリのローカライズに代わる軽量な方法です。 詳細については、「 WPF のグローバリゼーションとローカリゼーションの概要」を参照してください。
こちらも参照ください
.NET Desktop feedback