我正在使用我的项目引用的其中一个 dll 中提供的主题,如下所示:
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="pack://application:,,,/SomeNameSpace;component/Themes/SomeTheme.xaml"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
这个主题中恰好有一个我想修改的画笔。如果我知道画笔的“键”(通过使用 snoop 找到),是否可以重新定义它以具有不同的颜色?
我尝试了以下方法,但没有效果。
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="pack://application:,,,/SomeNameSpace;component/Themes/SomeTheme.xaml"/>
</ResourceDictionary.MergedDictionaries>
<LinearGradientBrush x:Key="keyNameFoundUsingSnoop">
...new value
</LinearGradientBrush>
</ResourceDictionary>
</Application.Resources>
我想知道这种类型的事情是否可能,因为当您没有要重新编译的 xaml 或者您想即时修改键值时。
编辑:我无法让它在 XAML 中工作,但设法在代码中得到类似的东西:
void ReplaceResource(ResourceDictionary _res, object _key, object _replacement)
{
foreach (var i in _res.Keys)
{
if (object.Equals(i, _key))
{
_res[i] = _replacement;
}
}
foreach (var i in _res.MergedDictionaries)
{
ReplaceResource(i, _key, _replacement);
}
}
(当我找到密钥时,我不会中断,因为在我的情况下它在多个字典中)
用法 :
var lightGray = new SolidColorBrush(Color.FromArgb(50, 255, 255, 255));
ReplaceResource(Application.Current.Resources, "KeyToFind", lightGray);