Xamarin.FormsでDynamicResourceを使ったテーマカラーの切り替えでハマった
Xamarin.Formsで動的なテーマカラーの切り替えを実装していて少しハマった件について書いておきます。
【やりたいこと】
App.xaml内に定義したColorリソースの中身を入れ替えてDynamicResourceで参照している箇所を変えたい
<?xml version="1.0" encoding="utf-8"?> <Application xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" x:Class="sample.App"> <Application.Resources> <ResourceDictionary> <Color x:Key="Primary">#000000</Color> <Color x:Key="PrimaryDark">#1976D2</Color> <Color x:Key="Accent">#00ff00</Color> <Color x:Key="LightBackgroundColor">#FAFAFA</Color> <Color x:Key="DarkBackgroundColor">#C0C0C0</Color> <Color x:Key="MediumGrayTextColor">#4d4d4d</Color> <Color x:Key="LightTextColor">#999999</Color> <Style TargetType="NavigationPage"> <Setter Property="BarBackgroundColor" Value="{StaticResource Primary}" /> <Setter Property="BarTextColor" Value="White" /> </Style> </ResourceDictionary> </Application.Resources> </Application>
【やったこと】
以下のブログにズバリ書いてあるので、参考にしながら実装しました。
blog.xamarin.com
App.Current.Resources ["backgroundColor"] = Color.White;
App.Current.Resources ["textColor"] = Color.Black;
が、なんどやってもDynamicにリソースが変わってくれません。。。
【調査結果】
いろいろ調べた結果、原因はColorクラスでした。
なんと!
Xamarin.Formsで使えるColorクラスというのはどうやらいくつかあるようなのです!!
(知っている人には当たり前かもしれませんが ^^;)
・System.Drawing.Color ← これを使っていた(不正解)
・Xamarin.Forms.Color ← 正解はこれ
・Android.Graphics.Color
・(もしかしたら他にもあるかも?)
Xamarin.Forms.Colorを使えば、Dynamicにリソース変更を反映させることが出来ます。
XAMLのIntelliSenseが効かない&&クイックアクションに「using Xamarin.Forms;」が出てこない
という状況だったのでハマってしまいました。