Xamarin.FormsのDynamicResource
アプリケーション内で使用する値や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}" />
サンプルコードはこちら.