ResourceDictionary クラス
定義
重要
一部の情報は、リリース前に大きく変更される可能性があるプレリリースされた製品に関するものです。 Microsoft は、ここに記載されている情報について、明示または黙示を問わず、一切保証しません。
アプリで使用するスタイルなどの XAML リソースのリポジトリを定義します。 XAML でリソースを定義し、{StaticResource} マークアップ拡張機能と {ThemeResource} マークアップ拡張を使用して XAML で取得できます。 コードを使用してリソースにアクセスすることもできますが、あまり一般的ではありません。
/// [Windows.Foundation.Metadata.ContractVersion(Windows.Foundation.UniversalApiContract, 65536)]
/// [Windows.Foundation.Metadata.MarshalingBehavior(Windows.Foundation.Metadata.MarshalingType.Agile)]
/// [Windows.Foundation.Metadata.Threading(Windows.Foundation.Metadata.ThreadingModel.Both)]
class ResourceDictionary : DependencyObject, IIterable<IKeyValuePair<IInspectable, IInspectable const&>>, IMap<IInspectable, IInspectable const&>
[Windows.Foundation.Metadata.ContractVersion(typeof(Windows.Foundation.UniversalApiContract), 65536)]
[Windows.Foundation.Metadata.MarshalingBehavior(Windows.Foundation.Metadata.MarshalingType.Agile)]
[Windows.Foundation.Metadata.Threading(Windows.Foundation.Metadata.ThreadingModel.Both)]
public class ResourceDictionary : DependencyObject, IDictionary<object,object>, IEnumerable<KeyValuePair<object,object>>
Public Class ResourceDictionary
Inherits DependencyObject
Implements IDictionary(Of Object, Object), IEnumerable(Of KeyValuePair(Of Object, Object))
<ResourceDictionary>
oneOrMoreResources
</ResourceDictionary>
- or -
<frameworkElement>
<frameworkElement.Resources>
oneOrMoreResources
</frameworkElement.Resources>
</frameworkElement>
- 継承
- 派生
- 属性
- 実装
-
IDictionary<Object,Object> IMap<IInspectable,IInspectable> IIterable<IKeyValuePair<K,V>> IEnumerable<KeyValuePair<K,V>> IEnumerable<KeyValuePair<Object,Object>> IIterable<IKeyValuePair<IInspectable,IInspectable>>
Windows の要件
| 要件 | 説明 |
|---|---|
| デバイス ファミリ |
Windows 10 (10.0.10240.0 で導入)
|
| API contract |
Windows.Foundation.UniversalApiContract (v1.0 で導入)
|
注釈
リソース ディクショナリは、アプリで使用されるスタイルなどの XAML リソースのリポジトリです。 XAML でリソースを定義し、{StaticResource} マークアップ拡張機能と {ThemeResource} マークアップ拡張を使用して XAML でそれらを取得できます。 コードを使用してリソースにアクセスすることもできますが、あまり一般的ではありません。 リソースを使用して、ブラシの色やピクセルの測定値などの特定の値がアプリ全体で一貫して使用されるようにすることができます。 リソース ディクショナリを効果的に使用する方法の詳細については、「 ResourceDictionary および XAML リソース参照」を参照してください。
ResourceDictionary 要素の使用
ResourceDictionary 型は、UWP アプリの全体的な構造にとって重要な 2 つのプロパティ FrameworkElement.Resources と Application.Resources の値として使用されます。 アプリの開始プロジェクト テンプレートから取得した XAML ファイルは FrameworkElement.Resources の初期値から始まり、app.xaml ファイルは Application.Resources の初期値で始まる場合があります。 そこで定義されているリソースは、使用しているプロジェクトの開始テンプレートによって異なります。
この XAML は 、FrameworkElement.Resources プロパティの使用方法を示しています。 この場合、 FrameworkElement は Page です。 Page.Resources プロパティ要素の下位に ResourceDictionary 要素はありませんが、その存在は暗黙的です。詳細については、以下の「XAML 構文に関する注意事項」セクションを参照してください。 XAML では、x:Key 属性値が "TextBlockStyle1" の ResourceDictionary にスタイルが配置されます。 XAML の下にある {StaticResource} マークアップ拡張機能は、リソース ディクショナリの Style を参照して、TextBlock 要素の Style プロパティの値を提供します。
次に示すように、Style は実際には TextBlock にスタイル設定を適用しませんが、Microsoft Visual Studioで Style プロパティを追加できます。 その後、ページ上で必要な頻度で Style リソースを使用して、統一性を適用できます。
Microsoft Visual Studioを使用してリソース ディクショナリを作成できます。 この例は、次の手順で作成されました。デザイン 画面に TextBlock を配置し、右クリックして [スタイルの編集] / [空の作成] を選択し、[ このドキュメント] を 選択して Page.Resources で新しいリソースを定義します。
<Page
x:Class="ResourceDictionary_example.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:ResourceDictionary_example"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d">
<Page.Resources>
<Style x:Key="TextBlockStyle1" TargetType="TextBlock"/>
</Page.Resources>
<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<TextBlock Style="{StaticResource TextBlockStyle1}" Text="TextBlock"/>
</Grid>
</Page>
AtomPub サンプルの AppPage.xaml ファイルのこの XAML は、Application.Resources プロパティの使用方法を示しています。 XAML は、2 つの Style 要素をリソース ディクショナリに配置し、アプリケーション全体で使用できるようにします。
<Application xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="AtomPub.App"
RequestedTheme="Light" >
<Application.Resources>
<ResourceDictionary>
<Style x:Key="TitleStyle" TargetType="TextBlock">
<Setter Property="Foreground" Value="#707070"/>
<Setter Property="FontFamily" Value="Segoe UI Light"/>
<Setter Property="FontSize" Value="16"/>
</Style>
<Style x:Key="H1Style" TargetType="TextBlock">
<Setter Property="Foreground" Value="#212121"/>
<Setter Property="FontFamily" Value="Segoe UI Semilight"/>
<Setter Property="FontSize" Value="26.667"/>
<Setter Property="Margin" Value="0,0,0,25"/>
</Style>
...
</ResourceDictionary>
</Application.Resources>
</Application>
MainPage.xaml ファイルの次の XAML では 、{StaticResource} マークアップ拡張機能 を使用して TitleStyle スタイルと H1Style スタイルにアクセスします。
...
<!-- Header -->
<StackPanel x:Name="Header" Grid.Row="0">
<StackPanel Orientation="Horizontal">
...
<TextBlock Text="Windows SDK Samples" VerticalAlignment="Bottom" Style="{StaticResource TitleStyle}" TextWrapping="Wrap"/>
</StackPanel>
<TextBlock x:Name="FeatureName" Text="Add Feature Name" Style="{StaticResource H1Style}" TextWrapping="Wrap"/>
</StackPanel>
...
ResourceDictionary をファイルのルート要素として使用することで、リソースを独自の XAML ファイルに組み込むことができます。 その後、これらのリソースを FrameworkElement.Resources または Application.Resources リソース ディクショナリに含めることができます。 これを行うには、 ResourceDictionary.MergedDictionaries プロパティまたは ResourceDictionary 要素の ResourceDictionary.ThemeDictionaries プロパティを使用します。
このファイル Common/Styles1.xaml では、ルート要素として ResourceDictionary を使用して Style リソースを定義します。
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Style x:Key="TitleTextStyle" TargetType="TextBlock">
<Setter Property="FontFamily" Value="Segoe UI Light"/>
<Setter Property="FontSize" Value="16"/>
</Style>
<Style x:Key="HeaderTextStyle" TargetType="TextBlock">
<Setter Property="FontFamily" Value="Segoe UI Semilight"/>
<Setter Property="FontSize" Value="26.667"/>
<Setter Property="Margin" Value="0,0,0,25"/>
</Style>
...
</ResourceDictionary>
次に、 スタイル リソースを同様に定義する Common/Styles2.xaml という別のファイルがあるとします。 この XAML では、 ResourceDictionary.MergedDictionaries プロパティを使用して、これら 2 つのファイル内のリソースをマージして Application.Resources リソース ディクショナリを作成する方法を示します。 XAML ではさらに 2 つの Style リソースも定義され、2 つのファイルのリソースとマージされます。
<Application
.... >
<Application.Resources>
<ResourceDictionary>
<Style x:Key="ErrorStyle" TargetType="TextBlock">
<Setter Property="Foreground" Value="DarkRed"/>
<Setter Property="FontFamily" Value="Segoe UI Semilight"/>
<Setter Property="FontSize" Value="15"/>
</Style>
<Style x:Key="StatusStyle" TargetType="TextBlock">
<Setter Property="Foreground" Value="Black"/>
<Setter Property="FontFamily" Value="Segoe UI Semilight"/>
<Setter Property="FontSize" Value="15"/>
</Style>
<ResourceDictionary.MergedDictionaries>
<!--
Styles that define common aspects of the platform look and feel
-->
<ResourceDictionary Source="Common/Styles1.xaml"/>
<ResourceDictionary Source="Common/Styles2.xaml"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
</Application>
マージされたディクショナリ リソースの解決方法については、 ResourceDictionary および XAML リソース参照の「マージされたリソース ディクショナリ」セクションを参照してください。
x:Key プロパティ
XAML では、ResourceDictionaryitem のキーは、XAML リソースを表す要素に x:Key 属性を設定することによって宣言されます。 通常、キー値を持たない子要素を ResourceDictionary に配置しようとすると、XAML 解析例外または Windows Runtimeexception がスローされます。 例外条件は、XAML デザイン サーフェイスによる警告として認識される場合もあります。 ただし、ResourceDictionarychild 要素に x:Key 属性値が必要ない場合は、次の 3 つの重要なケースがあります。
- Style リソースでは、その TargetType 値を暗黙的なリソース キーとして使用できます。 スタイルとコントロール テンプレートの暗黙的なキーのしくみの詳細については、「 コントロールのスタイル設定」を参照してください。
- ResourceDictionary.MergedDictionaries 値を表す Source 値を持つ ResourceDictionary 要素は、ResourceDictionary に x:Key 属性を持つことはありません。 マージされた各ディクショナリ ファイル (URI によって ソースとして参照されるファイル) 内では、各リソースのキーが必要です。
- 従来の理由から、 x:Key 属性 の代わりに x:Name 属性を使用できます。 ただし、 x:Name 属性 自体では、その項目の XAML リソース検索は有効になりません。 x:Name 属性識別規則は、ストーリーボードに設定されたアニメーションの定義など、特定のシナリオで使用されます。 詳細については、「 x:Name 属性」を参照してください。
ResourceDictionary の反復処理
C# または Microsoft Visual Basic で ResourceDictionary を反復処理できます。
foreach 構文の使用など、多くの場合、コンパイラはこのキャストを行います。明示的にIEnumerableにキャストする必要はありません。 明示的にキャストする必要がある場合 (たとえば、GetEnumerator を呼び出す場合)、KeyValuePair<Object、Object> 制約を使用して IEnumerable<T> にキャストします。
ResourceDictionary と Microsoft Visual Studio
Microsoft Visual Studioは、リソース ディクショナリの [新しい項目の追加] ページの選択肢を提供します。 このオプションは、マージされたディクショナリのソースとして機能するなど、新しいルーズ XAML リソース ディクショナリを定義する場合に常に使用します。 Microsoft Visual Studioは、[新しい項目の追加] を使用してテンプレート化されたコントロールを作成するたびに、緩やかな XAML リソース ディクショナリをプロジェクトに追加します。 このリソース ディクショナリには、既定のテーマ テンプレートが用意されています。 スタイルまたはテンプレートのコピーを編集し、選択したリソースの場所 (アプリ、ページ、またはスタンドアロン) の ResourceDictionary がまだ存在しない場合、Microsoft Visual Studio XAML で新しい ResourceDictionary が作成される場合があります。
XAML 構文に関する注意事項
ResourceDictionary の XAML 暗黙的なコレクション構文には、ResourceDictionary のオブジェクト要素が含まれていないことに注意してください。 これは、XAML の暗黙的なコレクション構文の例です。コレクション要素を表すタグは省略できます。 コレクションに項目として追加される要素は、基になる型がディクショナリ/マップ Add メソッドをサポートするプロパティのプロパティ要素の子要素として指定されます。
マージされたリソース ディクショナリの場合は、 ResourceDictionary.MergedDictionaries プロパティ要素と Source を宣言できるように、ResourceDictionary オブジェクト要素を明示的に宣言する必要があります。 したがって、少なくとも 2 つの ResourceDictionary オブジェクト要素が関係しており、この構文を使用します。
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="uri"/>
...
</ResourceDictionary.MergedDictionaries>
...
</ResourceDictionary>
この構文では、外側の ResourceDictionary がプライマリ ResourceDictionary です。 内部 ResourceDictionary は、マージされる ResourceDictionary です。
暗黙的なコレクションを使用する場合は、 プロパティ FrameworkElement.Resources に適したプレースホルダーが表示されます。 Application.Resources プロパティに対して、またはプロパティ型として ResourceDictionary を使用するカスタム プロパティに対して、この暗黙的なコレクションの使用を使用することもできます。
共有可能な型と UIElement 型
リソース ディクショナリは、XAML でこれらの型の共有可能な型と値を定義するための手法です。 すべての型または値が ResourceDictionary からの使用に適しているわけではありません。 共有がサポートされている型の例としては、 Style、 任意の FrameworkTemplate サブクラス、 XAML 組み込みデータ型、ブラシ、色、変換などがあります。 共有可能と見なされる型の詳細については、「 ResourceDictionary および XAML リソース参照」を参照してください。 一般に、 UIElement から派生した型は、特定のコントロール インスタンス上のテンプレートとテンプレートのアプリケーションから取得されない限り、共有できません。 テンプレートケースを除くと、 UIElement はインスタンス化された後、オブジェクト ツリー内の 1 つの場所にのみ存在することが想定され、 UIElement を 共有可能にすると、この原則に違反する可能性があります。
実際には、ResourceDictionary で定義されているリソースの大部分は次のいずれかになります。
- 表示状態を含む、コントロールのコントロール テンプレート。
- コントロールの一部のスタイルのサポート
- 一般的なアプリ UI の一部であるが、TextBlock などのコントロールではない要素のスタイル
- データ バインディングを使用するコントロールとパネルのデータ テンプレート
- 特定のブラシ値 (主に SolidColorBrush)
- ローカライズする必要のない文字列またはその他の定数 (ローカライズする必要がある文字列と定数は ResourceDictionary に含めないでください。詳細については、「 クイック スタート: UI リソースの翻訳」を参照してください)
コード内の ResourceDictionary オブジェクトへのアクセス
ResourceDictionary 内のリソースにアクセスするためにコードが使用する API は、使用するプログラミング言語によって異なります。
- C# または Microsoft Visual Basic では、IDictionary<TKey、TValue> および IEnumerable<T> を実装する API を使用します。 たとえば、 TryGetValue や Item インデクサーなどです。
- Visual C++ コンポーネント拡張機能 (C++/CX) では 、IMap<K、V> および IIterable<T> を実装する API を使用します。 たとえば、 Lookup です。
- Source など、コレクションサポートの一部ではない API は、すべての言語で同じです。
コードで ResourceDictionary を使用する方法の詳細については、 ResourceDictionary および XAML リソース参照の「コードからの ResourceDictionary の使用」セクションを参照してください。
システム リソース
一部のテーマ リソースでは、システム リソースの値が基になるサブ値として参照されます。 システム リソースは、XAML リソース ディクショナリには見つからない特殊なリソース値です。 これらの値は、Windows ランタイム XAML サポートの動作に依存してシステム自体から値を転送し、XAML リソースが参照できる形式で値を表します。
以前のバージョンの注意事項
Windows 8.1でのリソース読み込みの最適化
Windows 8.1以降、アプリ モデルとWindows ランタイム XAML パーサーによって有効になっているリソース読み込みの最適化があります。 Windows 8の場合、XAML パーサーは app.xaml からリソースを読み込み、それぞれのリソースをスタートアップの一部としてオブジェクトとして作成しました。 大きな辞書があれば、それはあまり効率的ではありませんでした。 また、これらのリソースには、3 つのテーマすべてに必要な項目が含まれており、3 つのテーマのうち 2 つもアクティブになりません。 Windows 8.1以降、XAML パーサーは、リソースが明示的に要求されたときにのみリソースを作成します。 要求は、他のリソースから、またはそれぞれが読み込まれるとき、アプリまたはページの XAML から送信される場合があります。 このパーサーの動作により、起動時にアプリ レベルのディクショナリの読み取りにかかる時間が最小限に抑えられます。また、ほとんどの場合、最初のアプリ ページの読み込みが速くなります。 現在アクティブでない他のテーマで必要なリソースは、そのテーマがユーザーによってアクティブなテーマになるように選択されている場合にのみ読み込まれます。 その時点で、要求に {ThemeResource} マークアップ拡張 が使用されていたリソースは、新しくアクティブなテーマに基づいて再計算されます。
Windows 8動作
Windows 8上で説明した最適化がありませんでした。
Application.Resourcesの ResourceDictionary は、スプラッシュ画面以外のページがアプリのウィンドウに読み込まれる前に解析を完了する必要がありました。 このため、Windows 8.1用にアプリを再ターゲットすると、タイミングにいくつかの違いが生じます。 アプリの読み込み速度は速くなりますが、この改善点と、再ターゲットの一環としてアプリ コードに加えた他の変更を分離できない場合があります。 最適化されたリソースの読み込みによるタイミング変更の証拠が表示される場所には、 アプリケーション オブジェクト、コンバーター、その他のカスタム クラスなどのオブジェクトについて、パーサーによってコンストラクターが呼び出されたときなどがあります。 Windows 8用にコンパイルされたが、Windows 8.1で実行されているアプリは、引き続きWindows 8動作を使用します。
パフォーマンスと XAML リソースファクターの詳細については、 XAML マークアップの最適化に関するページを参照してください。
コンストラクター
| Name | 説明 |
|---|---|
| ResourceDictionary() |
ResourceDictionary クラスの新しいインスタンスを初期化します。 |
プロパティ
| Name | 説明 |
|---|---|
| Dispatcher |
このオブジェクトが関連付けられている CoreDispatcher を取得します。 CoreDispatcher は、コードが UI 以外のスレッドによって開始された場合でも、UI スレッド上の DependencyObject にアクセスできる機能を表します。 (継承元 DependencyObject) |
| MergedDictionaries |
マージされたディクショナリのさまざまなリソース ディクショナリを構成する ResourceDictionary ディクショナリのコレクションを取得します。 |
| Size |
コレクションに含まれる要素の数を取得します。 |
| Source |
マージされたリソース ディクショナリのソースの場所を提供する URI (Uniform Resource Identifier) を取得または設定します。 |
| ThemeDictionaries |
"HighContrast" のテーマ値の指定など、テーマのシナリオに対応するために特にキーが設定され、構成されているマージされたリソース ディクショナリのコレクションを取得します。 |