ResourceDictionary クラス
定義
重要
一部の情報は、リリース前に大きく変更される可能性があるプレリリースされた製品に関するものです。 Microsoft は、ここに記載されている情報について、明示または黙示を問わず、一切保証しません。
アプリで使用されるスタイルなどの XAML リソースのリポジトリを定義します。 XAML でリソースを定義し、{StaticResource} マークアップ拡張機能と {ThemeResource} マークアップ拡張機能を使用して XAML でそれらを取得できます。 コードを使用してリソースにアクセスすることもできますが、あまり一般的ではありません。
/// [Windows.Foundation.Metadata.ContractVersion(Microsoft.UI.Xaml.WinUIContract, 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(Microsoft.UI.Xaml.WinUIContract), 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>>
注釈
リソース ディクショナリは、アプリで使用されるスタイルなどの XAML リソースのリポジトリです。 XAML でリソースを定義し、{StaticResource} マークアップ拡張機能と {ThemeResource} マークアップ拡張機能を使用して XAML でそれらを取得できます。 コードを使用してリソースにアクセスすることもできますが、あまり一般的ではありません。 リソースを使用して、ブラシの色やピクセルの測定値などの特定の値がアプリ全体で一貫して使用されるようにすることができます。 リソース ディクショナリを効果的に使用する方法の詳細については、「 ResourceDictionary および XAML リソース参照」を参照してください。
ResourceDictionary 要素の使用
このResourceDictionary
型は、Windows アプリ SDK アプリの全体的な構造にとって重要な 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" の Style を にResourceDictionary
配置します。 XAML のさらに下にある {StaticResource} マークアップ拡張機能は、リソース ディクショナリ内の をStyle
参照して、TextBlock 要素の Style プロパティの値を提供します。
示されている スタイル は、実際には TextBlock にスタイル設定を適用しませんが、Microsoft Visual Studio でプロパティを追加 Style
できます。 その後、ページで Style
必要な頻度でリソースを使用して、均一性を適用できます。
<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>
この XAML は、 AtomPub サンプルの AppPage.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
スタイル リソースを定義します。
<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.MergeedDictionaries プロパティを使用して、これら 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 では、アイテムのキー ResourceDictionary
は、XAML リソースを表す要素に x:Key 属性を設定することによって宣言されます。 通常、キー値を持たない子要素を にResourceDictionary
配置しようとすると、XAML 解析例外またはWindows ランタイム例外がスローされます。 例外条件は、XAML デザイン サーフェイスによって警告として示される場合もあります。 ただし、子要素に x:Key 属性値がResourceDictionary
必要ない場合は、次の 3 つの重要なケースがあります。
- Style リソースでは、その TargetType 値を暗黙的なリソース キーとして使用できます。 スタイルとコントロール テンプレートの暗黙的なキーのしくみの詳細については、「 コントロールのスタイル設定」を参照してください。
-
ResourceDictionary
ResourceDictionary.MergedDictionaries 値を表す Source 値を持つ要素には、 にResourceDictionary
x:Key 属性を指定することはできません。 マージされた各ディクショナリ ファイル (URI によって ソースとして参照されるファイル) 内では、各リソースのキーが必要です。 - 従来の理由から、x:Key 属性の代わりに x:Name 属性を使用できます。 ただし、 x:Name 属性 自体では、その項目の XAML リソース検索は有効になりません。 x:Name 属性識別規則は、ストーリーボード付きアニメーションの定義など、特定のシナリオで使用されます。 詳細については、「 x:Name 属性」を参照してください。
ResourceDictionary を反復処理する
C# で を ResourceDictionary
反復処理できます。 構文の使用 foreach
など、多くの場合、コンパイラはこのキャストを行います。明示的に キャストする IEnumerable
必要はありません。
GetEnumerator を呼び出す場合など、明示的にキャストする必要がある場合は、制約をKeyValuePair<Object,Object>
使用して IEnumerable にキャストします。
ResourceDictionary と Microsoft Visual Studio
Microsoft Visual Studio には、リソース ディクショナリの [新しい項目の追加] ページの選択肢が用意されています。 このオプションは、マージされたディクショナリのソースとして機能するなど、新しい緩やかな XAML リソース ディクショナリを定義する場合に常に使用します。 Microsoft Visual Studio では、テンプレート化されたコントロールを作成するために [新しい項目の追加] を使用するたびに、緩やかな XAML リソース ディクショナリもプロジェクトに追加されます。 このリソース ディクショナリには、既定のテーマ テンプレートが用意されています。 スタイルまたはテンプレートResourceDictionary
のコピーを編集していて、選択したリソースの場所 (アプリ、ページ、またはスタンドアロン) がまだ存在しない場合、Microsoft Visual Studio によって XAML に新しい ResourceDictionary
が作成される場合があります。
XAML 構文に関する注意事項
の XAML 暗黙的なコレクション構文 ResourceDictionary
には、 の 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# では、IDictionary<TKey、TValue>、IEnumerable を実装する API を使用します。 たとえば、 TryGetValue や Item インデクサーなどです。
- Source などのコレクションサポートの一部ではない API は、すべての言語で同じです。
コードで を使用 ResourceDictionary
する方法の詳細については、「 ResourceDictionary および XAML リソースリファレンス」の「コードから ResourceDictionary を使用する」セクションを参照してください。
システム リソース
一部のテーマ リソースは、システム リソース値を基になるサブ値として参照します。 システム リソースは、どの XAML リソース ディクショナリにも含まれていない特殊なリソース値です。 これらの値は、Windows ランタイム XAML サポートの動作に依存してシステム自体から値を転送し、XAML リソースが参照できる形式でその値を表します。
コンストラクター
ResourceDictionary() |
ResourceDictionary クラスの新しいインスタンスを初期化します。 |
プロパティ
Dispatcher |
常に Windows アプリ SDK アプリで を返します |
DispatcherQueue |
このオブジェクトが |
MergedDictionaries |
マージされたディクショナリ内のさまざまなリソース ディクショナリを構成する ResourceDictionary ディクショナリのコレクションを取得します。 |
Size |
コレクションに格納されている要素の数を取得します。 |
Source |
マージされたリソース ディクショナリのソースの場所を提供する Uri (Uniform Resource Identifier) を取得または設定します。 |
ThemeDictionaries |
"HighContrast" のテーマ値を指定するなど、テーマのシナリオに対応するために特にキーが設定され、構成されているマージされたリソース ディクショナリのコレクションを取得します。 |