shuhelohelo’s blog

Xamarin.Forms多めです.

Xamarin.FormsのDynamicResource

docs.microsoft.com

www.youtube.com

アプリケーション内で使用する値やStyleなどをResourceDictionaryに定義しておき,StaticResourceとして使用することはよくあります.

<Color x:Key="PrimaryColor">#547799</Color>

...

<Label TextColor="{StaticResource PrimaryColor}"/>

このResourceの値はプログラム中で変更することができます.

App.Current.Resources["PrimaryColor"] = Color.Orange;
//もしくはHexコードでもOk.
App.Current.Resources["PrimaryColor"] = "#00FF00";

さて,StaticResourceとして使用した場合,プログラム中でResourceの値を変更しても,UIに変更は生じません.上の例で言えば,Labelの文字色はオレンジ色にはなりません.

プログラムによって動的に値を変更して,その変更がUIをに反映されるようにするにはStaticResourceではなくDynamicResourceを使います.

<Label TextColor="{DynamicResource PrimaryColor}"/>

データバインディングと同じように変更が反映されます.

上でやった実行時のResourceの書き換えですが,以下のように他のResourceを指定することも可能です.こちらの使い方のほうが一般的かと思います.

App.Current.Resources["PrimaryColor"] = App.Current.Resource["SecondColor"];

例えば,App.xamlなどで以下のようにリソースを定義しておいて,上のように利用します.

                <Setter Property="BackgroundColor" Value="{DynamicResource PrimaryColor}" />

サンプルコードはこちら.

github.com