アプリケーション全体のリソースの作成と使用
XAML ページでリソースおよびスタイルを定義する方法は、コードの繰り返しを減らすのに最適です。 ただし、問題があります。 これらのリソースとスタイルを使用できるのは、その特定の XAML ページのみです。 複数のページがある場合、アプリケーション全体でコードの繰り返しを回避するには、ページ レベルのリソース ディクショナリでは不十分です。 このユニットでは、ご利用のアプリケーションにあるすべてのページにわたってリソースとスタイルを共有する方法を確認します。
リソース ディクショナリを使用できる場所
VisualElement クラスでは、Resources プロパティを定義します。 コントロール、ページ、レイアウトは VisualElement から継承されるため、これらすべてには、リソース ディクショナリを保持できる Resources プロパティがあります。
Application クラスでは、Resources プロパティも定義します。 Application は VisualElement から継承されないため、プロパティはこのクラスの一部として定義されます。
次の図に、一般的なアプリケーションの構造を示します。 示されている要素のそれぞれに、リソース ディクショナリを保持できる Resources プロパティがあります。
Note
この図は、アプリケーション内の項目の整理方法を簡略化して示しています。 この図では、ビュー という用語は、Button や Label などのシングルトン コントロールを指し、子コントロールのコンテナーとして機能しません。 また、レイアウト という用語は、子コントロールのレイアウトを整理する役割を持つコンテナーを意味します。 レイアウトは入れ子にすることができます。 たとえば、Grid コントロールは StackLayout コントロール内に保持できます。
アプリケーション レベルのリソースとスタイルを定義する方法
Application クラスに関連付けられている XAML ファイルでアプリケーションレベルのリソースおよびスタイルを定義します。 次のコードは、アプリケーション リソース ディクショナリで Color リソースを宣言する方法を示しています。
<Application.Resources>
<Color x:Key="MyTextColor">Blue</Color>
</Application.Resources>
.NET MAUI でリソースまたはスタイルを検索する方法
次のコードに示すように、コントロールのいずれかにリソースを適用するとします。
<Label TextColor="{StaticResource MyTextColor}" ... />
.NET MAUI では、値を適用できるように、そのリソースの定義を検索する必要があります。 1 つのアプリケーションに多くのディクショナリを含めることができます。 .NET MAUI はどの順序でどの辞書を検索しますか? これらの質問に答えるには、ページ上の VisualElement インスタンスがツリーのような構造を形成していると考えると役立ちます。 アプリケーションがルートで、その下にページ、レイアウト、ビューが広がっています。 この構造はビジュアル ツリーと呼ばれることが多いです。 ツリー内の各要素には、リソースを含めることができる独自のディクショナリを含めることができます。 .NET MAUI のスタイル検索アルゴリズムでは、ビジュアル ツリーをたどります。
リソースの適用先である VisualElement インスタンスのディクショナリで検索を始めます。 前の例では、検索は Label 型から始まります。 リソース ディクショナリがない場合、またはディクショナリはあるがそのリソースが存在しない場合、検索は続行されます。
(コントロールの) 親に移動し、検索を繰り返します。 通常、次の検索場所は、レイアウトです。
レイアウトの親を確認します。 通常、次に検索する場所はページですが、レイアウトが別のレイアウト内に入れ子になっている場合 (StackLayout 内の Grid など) は、検索は、ツリーを上がって親レイアウトに移動します。
Application クラスのディクショナリを確認します。
検索では、x:Key 値と一致する最初に見つかった項目が返されます。 次の図は、リソースの検索順序のまとめです。
実際には、ほとんどの開発者は、ビューおよびレイアウト内の Resources プロパティを無視します。 1 つのページで使用するものに対してページ レベルのディクショナリを使用します。 複数のページにわたって共有するリソースとスタイルは、アプリケーション レベルで定義されます。 検索プロセスでは、次の 2 つのディクショナリのみを確認する必要があります。現在のページ インスタンスとアプリケーションのディクショナリです。
Note
指定したキーを持つリソースが見つからない場合、アプリはスタイル設定に既定値を使用します。
重複キー
ResourceDictionary インスタンスはそれぞれ独立しています。つまり、同じ x:Key 値を複数のディクショナリで使用できるということです。 検索パスの複数のディクショナリに同じ x:Key 識別子があっても、エラーは発生しません。 パスで最初に一致した x:Key 値に関連付けられたリソースが、使用されるリソースです。
たとえば、Application クラスで次のリソースが定義されているとします。
<Application.Resources>
<x:String x:Key="msg">Two</x:String>
</Application.Resources>
次に、次のリソースを ContentPage で定義し、その同じページの Label に適用します。
<ContentPage.Resources>
<x:String x:Key="msg">One</x:String>
</ContentPage.Resources>
...
<Label Text="{StaticResource msg}">
最初に一致した x:Key 値が使用されるため、Text プロパティは One に設定されます。