動的リソースの使用と更新

完了

前のユニットでは、XAML でリソースを定義し、静的な値として使用しました。 ただし、StaticResource が適切ではない場合もあります。 以下のようなシナリオが考えられます。

  • ユーザーが実行時にアプリの外観を変更できるように、色のテーマを実装したいとします。 StaticResource マークアップ拡張機能はディクショナリ参照を 1 回だけ行うので、UI を動的に更新することはできません。

  • Web サーバー上にユーザー設定を格納し、アプリケーションの起動時に読み込みます。 キーがディクショナリに見つからない場合、StaticResource マークアップ拡張機能は例外をスローします。

このユニットでは、動的リソースを使って、このような問題を処理する方法を示します。

実行時にリソースを更新する方法

リソースをリソース ディクショナリに格納します。 これらのリソースを実行時に更新するコードを記述できます。 新しいリソースを追加したり、既存のリソースを削除したりすることもできます。

次の例を確認してください。

<ContentPage.Resources>
    <Color x:Key="PanelBackgroundColor">Blue</Color>
</ContentPage.Resources>

アプリケーション実行中に PanelBackgroundColor リソースの値を変更するとします。 ページの分離コード ファイルにコードを追加して、Resources プロパティにアクセスできます。 次の例では、前の XAML の例のリソースの値を別の色に更新します。

this.Resources["PanelBackgroundColor"] = Colors.Green;

DynamicResource とは

DynamicResource は、リソース ディクショナリ内のリソースを検索するためのもう 1 つのマークアップ拡張です。 ターゲット オブジェクトが作成されるときにディクショナリの検索を実行する点が、StaticResource と似ています。 しかし、これは、ディクショナリ内のリソースに対する変更もリッスンします。 ディクショナリ内のリソースの値が変更された場合、DynamicResource によって UI が自動的に更新されます。

DynamicResource には StaticResource より利点があります。 DynamicResource では、ディクショナリにキーが見つからない場合、プロパティが未設定のままになります。 StaticResource と異なり、キーが見つからなくてもエラーではなく、例外をスローしません。

注意

DynamicResource マークアップ拡張の性質により、アプリケーションのパフォーマンスが少し低下します。 XAML ページでは StaticResource の代わりに DynamicResource を使用できますが、リソースが変更されない場合は、StaticResource マークアップ拡張で参照する必要があります。

前の例で更新された背景色を使用するには、次のように XAML コードで DynamicResource を適用できます。

<ContentPage ...>
    <ContentPage.Resources>
        <Color x:Key="PanelBackgroundColor">Blue</Color>
    </ContentPage.Resources>

    <StackLayout BackgroundColor="{DynamicResource PanelBackgroundColor}">
    ...
    </StackLayout>
</ContentPage>

PanelBackgroundColor リソースの値が変更されると、StackLayout コントロールの BackgroundColor の値が自動的に更新されます。

知識チェック

1.

DynamicResource では提供され、StaticResource では提供されない機能は何ですか?