WPF - переопределить ресурс из темы?
Я использую тему, которая поставляется в одной из ссылок моего проекта, например, так:
<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);