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

Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) リソースでは、マージされたリソース ディクショナリ機能がサポートされます。resources support a merged resource dictionary feature. この機能を使用すると、WPFWPF アプリケーションのリソース部分を、コンパイル済み XAMLXAML アプリケーションの外部で定義できます。This feature provides a way to define the resources portion of a WPFWPF application outside of the compiled XAMLXAML application. その後、リソースをアプリケーション間で共有できます。また、ローカライズ用に簡単に切り分けることができます。Resources can then be shared across applications and are also more conveniently isolated for localization.

マージされたリソース ディクショナリの導入Introducing a Merged Resource Dictionary

マークアップでは、マージされたリソース ディクショナリをページに導入するために次の構文を使います。In markup, you use the following syntax to introduce a merged resource dictionary into a page:

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

ResourceDictionary 要素にはX:Key ディレクティブがないことに注意してください。これは、リソースコレクション内のすべての項目に対して通常必要となります。Note that the ResourceDictionary element does not have an x:Key Directive, which is generally required for all items in a resource collection. ただし、MergedDictionaries コレクション内の別の ResourceDictionary 参照は特殊なケースで、このマージされたリソースディクショナリのシナリオ用に予約されています。But another ResourceDictionary reference within the MergedDictionaries collection is a special case, reserved for this merged resource dictionary scenario. マージされたリソースディクショナリを導入する ResourceDictionary には、 X:Key ディレクティブを含めることはできません。The ResourceDictionary that introduces a merged resource dictionary cannot have an x:Key Directive. 通常、MergedDictionaries コレクション内の各 ResourceDictionarySource 属性を指定します。Typically, each ResourceDictionary within the MergedDictionaries collection specifies a Source attribute. Source の値は、マージされるリソースファイルの場所に解決される uniform resource identifier (URI) である必要があります。The value of Source should be a uniform resource identifier (URI) that resolves to the location of the resources file to be merged. その URI の送信先は、ルート要素として ResourceDictionary を持つ別の XAMLXAML ファイルである必要があります。The destination of that URI must be another XAMLXAML file, with ResourceDictionary as its root element.

注意

Sourceを指定する代わりとして、または指定したソースに含まれるすべてのリソースに加えて、マージされたディクショナリとして指定された ResourceDictionary 内のリソースを定義することはできます。It is legal to define resources within a ResourceDictionary that is specified as a merged dictionary, either as an alternative to specifying Source, or in addition to whatever resources are included from the specified source. ただし、これは一般的なシナリオではありません。マージされたディクショナリの主要なシナリオは、外部ファイルの場所からリソースをマージすることです。However, this is not a common scenario; the main scenario for merged dictionaries is to merge resources from external file locations. ページのマークアップ内にリソースを指定する場合は、通常、マージされたディクショナリではなく、メイン ResourceDictionary で定義する必要があります。If you want to specify resources within the markup for a page, you should typically define these in the main ResourceDictionary and not in the merged dictionaries.

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

マージされたディクショナリ内のリソースは、それらのリソースがマージされる先のメイン リソース ディクショナリのスコープの直後のリソース参照スコープの場所全体を占めます。Resources in a merged dictionary occupy a location in the resource lookup scope that is just after the scope of the main resource dictionary they are merged into. リソース キーは個々のディクショナリ内で一意である必要がありますが、マージされたディクショナリのセット内に 1 つのキーが複数回存在してもかまいません。Although a resource key must be unique within any individual dictionary, a key can exist multiple times in a set of merged dictionaries. この場合、返されるリソースは、MergedDictionaries コレクションで順番に見つかった最後のディクショナリから取得されます。In this case, the resource that is returned will come from the last dictionary found sequentially in the MergedDictionaries collection. MergedDictionaries コレクションが XAMLXAMLで定義されている場合、コレクション内のマージされたディクショナリの順序は、マークアップで指定された要素の順序になります。If the MergedDictionaries collection was defined in XAMLXAML, then the order of the merged dictionaries in the collection is the order of the elements as provided in the markup. プライマリ ディクショナリ内とマージされたディクショナリ内の両方でキーが定義されている場合、返されるリソースはプライマリ ディクショナリから取られます。If a key is defined in the primary dictionary and also in a dictionary that was merged, then the resource that is returned will come from the primary dictionary. これらのスコープ規則は、静的なリソース参照と動的なリソース参照の両方に等しく適用されます。These scoping rules apply equally for both static resource references and dynamic resource references.

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

マージされたディクショナリは、コードを使って Resources ディクショナリに追加できます。Merged dictionaries can be added to a Resources dictionary through code. 既定では、Resources プロパティに存在する既定の空の ResourceDictionary には、既定の空の MergedDictionaries コレクションプロパティもあります。The default, initially empty ResourceDictionary that exists for any Resources property also has a default, initially empty MergedDictionaries collection property. コードを使用してマージされたディクショナリを追加するには、目的のプライマリ ResourceDictionaryへの参照を取得し、その MergedDictionaries プロパティ値を取得し、MergedDictionariesに含まれる汎用 CollectionAdd を呼び出します。To add a merged dictionary through code, you obtain a reference to the desired primary ResourceDictionary, get its MergedDictionaries property value, and call Add on the generic Collection that is contained in MergedDictionaries. 追加するオブジェクトは、新しい ResourceDictionaryである必要があります。The object you add must be a new ResourceDictionary. コードでは、Source プロパティを設定しません。In code, you do not set the Source property. 代わりに、オブジェクトを作成するか、または1つを読み込んで、ResourceDictionary オブジェクトを取得する必要があります。Instead, you must obtain a ResourceDictionary object by either creating one or loading one. 既存の ResourceDictionary を読み込み、ResourceDictionary ルートを持つ既存の XAMLXAML ファイルストリームで XamlReader.Load を呼び出す方法の1つとして、XamlReader.Load の戻り値を ResourceDictionaryにキャストする方法があります。One way to load an existing ResourceDictionary to call XamlReader.Load on an existing XAMLXAML file stream that has a ResourceDictionary root, then casting the XamlReader.Load return value to ResourceDictionary.

マージされたリソース ディクショナリの URIMerged Resource Dictionary URIs

マージされたリソースディクショナリを含める方法には、いくつかの方法があります。これは、使用する URI (uniform resource identifier) 形式によって示されます。There are several techniques for how to include a merged resource dictionary, which are indicated by the uniform resource identifier (URI) format that you will use. 大まかに言えば、これらの手法は 2 つのカテゴリに分類できます。プロジェクトの一部としてコンパイルされるリソースと、プロジェクトの一部としてコンパイルされないリソースです。Broadly speaking, these techniques can be divided into two categories: resources that are compiled as part of the project, and resources that are not compiled as part of the project.

プロジェクトの一部としてコンパイルされるリソースの場合は、リソースの場所を参照する相対パスを使うことができます。For resources that are compiled as part of the project, you can use a relative path that refers to the resource location. 相対パスは、コンパイル中に評価されます。The relative path is evaluated during compilation. リソースは、リソースのビルド アクションでプロジェクトの一部として定義する必要があります。Your resource must be defined as part of the project as a Resource build action. リソースの .xaml ファイルをリソースとしてプロジェクトに組み込む場合は、リソース ファイルを出力ディレクトリにコピーする必要がありません。リソースは、コンパイルされたアプリケーション内にあらかじめ組み込まれます。If you include a resource .xaml file in the project as Resource, you do not need to copy the resource file to the output directory, the resource is already included within the compiled application. コンテンツのビルド アクションを使うこともできますが、その場合は、ファイルを出力ディレクトリにコピーして、実行可能ファイルに対して同じパスにリソース ファイルを配置する必要があります。You can also use Content build action, but you must then copy the files to the output directory and also deploy the resource files in the same path relationship to the executable.

注意

埋め込みリソースのビルド アクションは使用しないでください。Do not use the Embedded Resource build action. ビルドアクション自体は WPFWPF アプリケーションでサポートされていますが、Source の解決には ResourceManagerが組み込まれていないため、個々のリソースをストリームから分離することはできません。The build action itself is supported for WPFWPF applications, but the resolution of Source does not incorporate ResourceManager, and thus cannot separate the individual resource out of the stream. リソースにアクセスするために ResourceManager を使用する場合に限り、埋め込みリソースを他の目的に使用することもできます。You could still use Embedded Resource for other purposes so long as you also used ResourceManager to access the resources.

これと関連して、XAMLXAML ファイルに対するパック URI を使い、その URI をソースとして参照する手法もあります。A related technique is to use a Pack URI to a XAMLXAML file, and refer to it as Source. パック URI を使用すると、参照したアセンブリのコンポーネントを参照したり、その他の手法を利用したりできます。Pack URI enables references to components of referenced assemblies and other techniques. パック URI の詳細については、「WPF アプリケーションのリソース ファイル、コンテンツ ファイル、およびデータ ファイル」を参照してください。For more information on Pack URIs, see WPF Application Resource, Content, and Data Files.

プロジェクトの一部としてコンパイルされないリソースでは、URI が実行時に評価されます。For resources that are not compiled as part of the project, the URI is evaluated at run time. リソース ファイルを参照するために、file: や http: などの一般的な URI トランスポートを使うことができます。You can use a common URI transport such as file: or http: to refer to the resource file. コンパイルされないリソースの手法を使うことの欠点は、file: アクセスには追加の配置手順が必要になることと、http: アクセスはインターネット セキュリティ ゾーンを意味することです。The disadvantage of using the noncompiled resource approach is that file: access requires additional deployment steps, and http: access implies the Internet security zone.

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

マージするリソースディクショナリは任意の有効な URI (uniform resource identifier) を介して参照できるため、アプリケーション間でマージされたリソースディクショナリを再利用または共有できます。You can reuse or share merged resource dictionaries between applications, because the resource dictionary to merge can be referenced through any valid uniform resource identifier (URI). これを行うための具体的な方法は、アプリケーションの配置方法と、採用するアプリケーション モデルによって異なります。Exactly how you do this will depend on your application deployment strategy and which application model you follow. 前述のパック URI の手法を使うと、開発中にアセンブリ参照を共有することにより、マージされたリソースを複数のプロジェクトから取得する一般的な方法を利用することができます。The aforementioned Pack URI strategy provides a way to commonly source a merged resource across multiple projects during development by sharing an assembly reference. このシナリオでは、リソースはまだクライアントによって配布されるため、少なくとも 1 つのアプリケーションで参照先のアセンブリを配置する必要があります。In this scenario the resources are still distributed by the client, and at least one of the applications must deploy the referenced assembly. また、http プロトコルを使う分散 URI によって、マージされたリソースを参照することもできます。It is also possible to reference merged resources through a distributed URI that uses the http protocol.

マージされたディクショナリ/アプリケーションの配置で考えられる別のシナリオは、マージされたディクショナリをローカル アプリケーション ファイルとして、またはローカルの共有記憶域に書き出すことです。Writing merged dictionaries as local application files or to local shared storage is another possible merged dictionary / application deployment scenario.

ローカリゼーションLocalization

ローカライズする必要のあるリソースが、プライマリ ディクショナリにマージされたディクショナリに分離されて、Loose XAMLXAML ファイルとして保持されている場合、これらのファイルを別個にローカライズすることができます。If resources that need to be localized are isolated to dictionaries that are merged into primary dictionaries, and kept as loose XAMLXAML, these files can be localized separately. これは、サテライト リソース アセンブリをローカライズするよりも簡易な手法です。This technique is a lightweight alternative to localizing the satellite resource assemblies. 詳細については、「WPF のグローバリゼーションおよびローカリゼーションの概要」を参照してください。For details, see WPF Globalization and Localization Overview.

関連項目See also