マージされたリソース ディクショナリ

Windows Presentation Foundation (WPF) リソースは、マージされたリソース ディクショナリの機能をサポートしています。 この機能を使用すると、WPF アプリケーションのリソース部分を、コンパイルされた XAML アプリケーションの外部で定義することができます。 これにより、リソースを複数のアプリケーションで共有できるようになるほか、リソースをローカリゼーションのために分離するのにも便利です。

マージされたリソース ディクショナリの導入

マークアップでは、次の構文を使用して、マージされたリソース ディクショナリをページに導入します。

<Page.Resources>
  <ResourceDictionary>
    <ResourceDictionary.MergedDictionaries>
      <ResourceDictionary Source="myresourcedictionary.xaml"/>
      <ResourceDictionary Source="myresourcedictionary2.xaml"/>
    </ResourceDictionary.MergedDictionaries>
  </ResourceDictionary>
</Page.Resources>

ResourceDictionary 要素に x:Key ディレクティブがないことに注目してください。この属性は、通常はリソース コレクションのすべての項目に必要です。 ただし、MergedDictionaries コレクション内のもう 1 つの ResourceDictionary 参照は、特殊なケースであり、このマージされたリソース ディクショナリ シナリオに予約されています。 マージされたリソース ディクショナリを導入する ResourceDictionary は、x:Key ディレクティブを持つことができません。 通常、MergedDictionaries コレクション内の各 ResourceDictionary では、Source 属性を指定します。 Source の値は、マージするリソース ファイルの場所に解決されるuniform resource identifier (URI) である必要があります。 その URI の参照先は、ResourceDictionary をルート要素とする別の XAML ファイルである必要があります。

メモメモ

Source の指定に代わる手段として、または指定したソースから組み込むリソースに加えて、マージされたディクショナリとして指定されている ResourceDictionary 内でリソースを定義できます。ただし、これは一般的なシナリオではありません。マージされたディクショナリの主要なシナリオは、外部のファイルの場所からリソースをマージすることです。ページのマークアップ内でリソースを指定する場合は、通常は、マージされたディクショナリではなくメインの ResourceDictionary で定義します。

マージされたディクショナリの動作

リソース ルックアップ スコープでは、マージされたディクショナリのリソースの位置は、マージ先のメイン リソース ディクショナリのスコープの直後になります。 リソース キーは、個々のディクショナリの中では一意である必要がありますが、マージされたディクショナリのセットの中では、1 つのキーが複数存在していてもかまいません。 その場合、返されるリソースは、MergedDictionaries コレクション内で最後に見つかったディクショナリのリソースになります。 MergedDictionaries コレクションを XAML で定義した場合は、マークアップで要素を指定した順序がコレクション内のマージされたディクショナリの順序になります。 プライマリ ディクショナリで定義されているキーがマージされたディクショナリでも定義されていた場合は、プライマリ ディクショナリのリソースが返されます。 これらのスコープ規則は、静的リソース参照と動的リソース参照の両方に同じように適用されます。

マージされたディクショナリとコード

マージされたディクショナリをコードで Resources ディクショナリに追加することもできます。 すべての Resources プロパティに存在する既定の ResourceDictionary (最初は空) には、既定の MergedDictionaries コレクション プロパティ (最初は空) もあります。 マージされたディクショナリをコードで追加するには、目的のプライマリ ResourceDictionary への参照を取得し、その MergedDictionaries プロパティの値を取得して、MergedDictionaries に含まれているジェネリック Collection で Add を呼び出します。 追加するオブジェクトは、新しい ResourceDictionary である必要があります。 コードでは、Source プロパティは設定しません。 代わりに、作成するか読み込むかして ResourceDictionary オブジェクトを取得する必要があります。 既存の ResourceDictionary を読み込むには、ResourceDictionary ルートを持つ既存の XAML ファイル ストリームで XamlReader.Load を呼び出して、戻り値の XamlReader.LoadResourceDictionary にキャストする方法などがあります。

マージされたリソース ディクショナリ の URI

マージされたリソース ディクショナリを含めるにはいくつかの方法があります。それらの方法は、使用する uniform resource identifier (URI) の形式によって示されます。大まかに言うと、それらの方法は、プロジェクトの一部としてコンパイルされるリソースと、プロジェクトの一部としてコンパイルされないリソースの 2 つのカテゴリに分類できます。

プロジェクトの一部としてコンパイルされるリソースの場合は、リソースの場所を参照する相対パスを使用できます。 その相対パスはコンパイル時に評価されます。 この場合、リソースは、Resource ビルド アクションでプロジェクトの一部として定義されている必要があります。 リソースの .xaml ファイルをプロジェクトに Resource として含める場合、そのリソース ファイルを出力ディレクトリにコピーする必要はありません。リソースは、コンパイルされたアプリケーションに既に含まれています。 Content ビルド アクションを使用することもできますが、その場合は、ファイルを出力ディレクトリにコピーする必要があります。また、リソース ファイルを実行可能ファイルと同じパス関係に配置する必要もあります。

メモメモ

Embedded Resource ビルド アクションは使用しないでください。このビルド アクション自体は WPF アプリケーションでサポートされていますが、Source の解決には ResourceManager は含まれないため、個々のリソースをストリームから分離できません。その他の目的で Embedded Resource を使用することはできますが、リソースへのアクセスには ResourceManager を使用する必要があります。

関連する手法として、XAML ファイルへの Pack URI を使用して、それを Source として参照することもできます。 Pack URI を使用すると、参照アセンブリのコンポーネントを参照できるほか、その他の手法も使用できるようになります。Pack URI の詳細については、「WPF アプリケーションのリソース ファイル、コンテンツ ファイル、およびデータ ファイル」を参照してください。

プロジェクトの一部としてコンパイルされないリソースの場合、URI は実行時に評価されます。 この場合は、file: や http: などの一般的な URI トランスポートを使用してリソース ファイルを参照できます。 コンパイルされないリソースの方法を使用する場合、file: アクセスでは追加の配置のステップが必要になり、http: アクセスではインターネット セキュリティ ゾーンが使用されるというデメリットがあります。

マージされたディクショナリの再利用

マージされたディクショナリは、複数のアプリケーションの間で再利用したり共有したりできます。これは、マージするリソース ディクショナリを有効なuniform resource identifier (URI) によって参照できるからです。 そのための具体的な方法は、アプリケーションの配置方法や、採用されているアプリケーション モデルによって異なります。 上で挙げた Pack URI の方法を使用すると、アセンブリ参照を共有することにより、マージされたリソースを開発の間に複数のプロジェクトでソースとして共有することができます。 このシナリオでは、リソースはクライアントによって配布されるため、少なくとも 1 つのアプリケーションが参照アセンブリを配置する必要があります。また、http プロトコルを使用する配布 URI によって、マージされたリソースを参照することもできます。

そのほか、マージされたディクショナリをローカル アプリケーション ファイルやローカル共有ストレージに書き込むことによって、マージされたディクショナリ/アプリケーションを配置することもできます。

ローカリゼーション

ローカライズする必要があるリソースを、プライマリ ディクショナリにマージされるディクショナリに分離して Loose XAML として保持すると、それらのファイルを個別にローカライズできます。 この方法は、サテライト リソース アセンブリをローカライズする代わりに、より軽量な方法として使用できます。 詳細については、「WPF のグローバリゼーションおよびローカリゼーションの概要」を参照してください。

参照

参照

ResourceDictionary

概念

リソースの概要

リソースとコード

WPF アプリケーションのリソース ファイル、コンテンツ ファイル、およびデータ ファイル