ResourceDictionary クラス

定義

アプリで使用されるスタイルなどの 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>
継承
Object IInspectable DependencyObject ResourceDictionary
派生
属性
実装

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.ResourcesApplication.Resources の値として使用されます。 アプリの開始プロジェクト テンプレートから取得する XAML ファイルは 、FrameworkElement.Resources の初期値から始まり、app.xaml ファイルは Application.Resources の初期値で始まる場合があります。 そこで定義されているリソースは、使用しているプロジェクト開始テンプレートによって正確に異なります。

この XAML は、 FrameworkElement.Resources プロパティの使用方法を示しています。 この場合、 FrameworkElementPage です。 Page.Resources プロパティ要素に従属する ResourceDictionary 要素はありませんが、その存在は暗黙的です。詳細については、以下の「XAML 構文に関する注意事項」セクションを参照してください。 XAML は、x:Key 属性値が "TextBlockStyle1" の ResourceDictionary に Style を配置します。 XAML のさらに下にある {StaticResource} マークアップ拡張機能は、リソース ディクショナリの Style を参照して、TextBlock 要素の 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>

この 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 では、ResourceDictionaryitems のキーは、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<オブジェクト、オブジェクト制約を使用して 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 オブジェクト要素を明示的に宣言して、 ResourceDictionary.MergedDictionaries プロパティ要素と Source も宣言できるようにする必要があります。 したがって、少なくとも 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 は、使用するプログラミング言語によって異なります。

コードで 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上記の最適化がありませんでした。 の ResourceDictionary Application.Resources は、スプラッシュスクリーン以外のページがアプリの ウィンドウに読み込まれる前に解析を完了する必要がありました。 このため、アプリをWindows 8.1に再ターゲットするタイミングにいくつかの違いが生じます。 アプリの読み込み速度は速くなりますが、この改善点と、再ターゲットの一環としてアプリ コードに加えた他の変更を分離できない場合があります。 最適化されたリソース読み込みによるタイミング変更の証拠が表示される場所には、 Application オブジェクト、コンバーター、その他のカスタム クラスなどのオブジェクトに対して、パーサーによってコンストラクターが呼び出されたときなどがあります。 Windows 8 用にコンパイルしたアプリは、Windows 8.1 上で実行しても Windows 8 のときと同じ動作になります。

パフォーマンスと XAML リソースファクターの詳細については、「 XAML マークアップを最適化する」を参照してください。

コンストラクター

ResourceDictionary()

ResourceDictionary クラスの新しいインスタンスを初期化します。

プロパティ

Dispatcher

このオブジェクトが関連付けられている CoreDispatcher を取得します。 CoreDispatcher は、コードが UI 以外のスレッドによって開始された場合でも、UI スレッド上の DependencyObject にアクセスできる機能を表します。

(継承元 DependencyObject)
MergedDictionaries

マージされたディクショナリ内のさまざまなリソース ディクショナリを構成する ResourceDictionary ディクショナリのコレクションを取得します。

Size

コレクションに格納されている要素の数を取得します。

Source

マージされたリソース ディクショナリのソースの場所を提供する Uri (Uniform Resource Identifier) を取得または設定します。

ThemeDictionaries

"HighContrast" のテーマ値を指定するなど、テーマのシナリオに対応するために特にキーが設定され、構成されているマージされたリソース ディクショナリのコレクションを取得します。

メソッド

Clear()

この ResourceDictionary からすべての項目を削除します。

ClearValue(DependencyProperty)

依存関係プロパティのローカル値をクリアします。

(継承元 DependencyObject)
First()

コレクション内の項目の反復子を返します。

GetAnimationBaseValue(DependencyProperty)

依存関係プロパティに対して確立された基本値を返します。これは、アニメーションがアクティブでない場合に適用されます。

(継承元 DependencyObject)
GetValue(DependencyProperty)

DependencyObject から依存関係プロパティの現在の有効な値を返します。

(継承元 DependencyObject)
GetView()

ResourceDictionary に対するビューを取得します。

HasKey(Object)

ResourceDictionary に、要求されたキーを含むエントリがあるかどうかを返します。

Insert(Object, Object)

ResourceDictionary に新しいエントリを追加します。

Lookup(Object)

そのキーを持つエントリが存在する場合は、要求されたキーから値を返します。

ReadLocalValue(DependencyProperty)

ローカル値が設定されている場合は、依存関係プロパティのローカル値を返します。

(継承元 DependencyObject)
RegisterPropertyChangedCallback(DependencyProperty, DependencyPropertyChangedCallback)

この DependencyObject インスタンスの特定の DependencyProperty に対する変更をリッスンするための通知関数を登録します。

(継承元 DependencyObject)
Remove(Object)

ResourceDictionary から特定の項目を削除します。

SetValue(DependencyProperty, Object)

DependencyObject の依存関係プロパティのローカル値を設定します。

(継承元 DependencyObject)
UnregisterPropertyChangedCallback(DependencyProperty, Int64)

RegisterPropertyChangedCallback を呼び出して以前に登録した変更通知を取り消します。

(継承元 DependencyObject)

適用対象

こちらもご覧ください