我的目标是在 Base 主题中定义样式,并能够通过使用ResourceDictionary
. 由于Freezable Objects ,我已经能够让它与某些属性一起使用,但显然不能与其他属性一起使用,颜色是一种不起作用的属性。我认为更改 ResourceDictionary 中的 Color 值会起作用,但事实并非如此:
MainWindow.xaml:
<Grid Background="{DynamicResource PrimaryBackgroundColor}">
基础\Base.xaml:
<SolidColorBrush x:Key="PrimaryBackgroundColor" Color="{DynamicResource Color_Base}"/>
基\Colors.xaml:
<Color x:Key="Color_Base">Red</Color>
自定义\Colors.xaml:
<Color x:Key="Color_Base">Blue</Color>
主题.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)。
我错过了什么?如何在运行时更改颜色值?
对于完整的代码,这里是一个要点:https ://gist.github.com/dirte/773e6baf9a678e7632e6
编辑:
这看起来是最相关的:https ://stackoverflow.com/a/17791735/1992193但我认为样式的全部意义在于在一个地方定义它并让所有东西都使用它而无需修改后面的每个 xaml/代码? 什么是最好的解决方案?
我知道一种解决方案是将整个基本主题简单地复制到自定义主题中,然后只加载您想要的主题,但是它需要在每个不需要的主题文件中管理每个属性。