Используйте расширение DynamicResource вместо расширения StaticResource во всех ссылках на ключи, которые могут изменяться во время выполнения.
Затем вы можете использовать код, подобный следующему, чтобы изменить значение.
Application.Current.Resources["Default Color"] = System.Windows.Media.Colors.Red;
Это можно сделать для каждого объекта ...
public MyWindow()
{
InitializeComponent();
this.Resources["Default Color"] = System.Windows.Media.Colors.Red;
PART_DynamicButton.Resources["Default Color"] = System.Windows.Media.Colors.Red;
}
Это более высокая производительность, чем очистка всего словаря объединенных ресурсов и добавление нового, если вам нужно только изменить несколько значений.
Просто помните, что расширение DynamicResource работает только для DependencyProperties, а объекты Freezable, созданные в Xaml, обычно замораживаются, что предотвращает изменение их свойств DependencyProperties. Поэтому не пытайтесь изменить цвет SolidColorBrush, если кисть была создана в xaml.
Вот обходной путь
<! -- Xaml -->
<SolidColorBrush x:Key="App_Page_Background" Color="White"/>
<Page Background="{DynamicResource App_Page_Background}"/>
// C# code
Application.Current.Resources["App_Page_Background"] = new SolidColorBrush(Colors.Red);