私の目標は、Base テーマでスタイルを定義し、Custom テーマの特定の値を .xml を使用して重ねて読み込むことでオーバーライドできるようにすることResourceDictionary
です。一部のプロパティで動作させることができましたが、明らかにFreezable Objectsが原因で他のプロパティでは動作しませんでした。色は動作していません。ResourceDictionary の Color 値を変更するとうまくいくと思いましたが、そうではありません:
MainWindow.xaml:
<Grid Background="{DynamicResource PrimaryBackgroundColor}">
Base\Base.xaml:
<SolidColorBrush x:Key="PrimaryBackgroundColor" Color="{DynamicResource Color_Base}"/>
Base\Colors.xaml:
<Color x:Key="Color_Base">Red</Color>
カスタム\Colors.xaml:
<Color x:Key="Color_Base">Blue</Color>
Theme.cs:
foreach (ResourceDictEntry rde in changeList)
{
Application.Current.Resources
.MergedDictionaries
.ElementAt(rde.dicIndex)[rde.key] = rde.value;
}
私がステップスルーすると、コードは正常に動作しているように見えます。 MergedDictionary エントリがColor_Base
Red#FFFF0000
から Blueに変更されているのが見え#FF0000FF
ます。
ただし、背景が DynamicResource にバインドされているグリッドはPrimaryBackgroundColor
、赤から青に変更されていません。
Snoop にはエラーは表示されません。Grid.Background 値は、PrimaryBackgroundColor を赤 (#FFFF0000) として示します。
私は何が欠けていますか?実行時に Color 値を変更するにはどうすればよいですか?
完全なコードについては、ここに要点があります: https://gist.github.com/dirte/773e6baf9a678e7632e6
編集:
これは最も関連性が高いように見えます: https://stackoverflow.com/a/17791735/1992193しかし、スタイルの全体的なポイントは、それを1か所で定義し、すべてのxaml/コードビハインドを変更することなくすべてがそれを使用できるようにすることだと思いました? 最善の解決策は何ですか?
基本テーマ全体をカスタム テーマに単純にコピーし、必要なテーマのみを読み込むことが 1 つの解決策であることはわかっていますが、すべてのプロパティをすべてのテーマ ファイルで管理する必要があり、望ましくありません。