私のプロジェクトが参照するdllの1つで提供されているテーマを使用しています。
<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);