我有一个简单的WPF应用程序来改变颜色主题。
ResourceDictionary blueDict = new ResourceDictionary() { Source = new Uri(@"/Styles/Colors/Blue/BlueColors.xaml", UriKind.Relative) };
ResourceDictionary greenDict = new ResourceDictionary() { Source = new Uri(@"/Styles/Colors/Green/GreenColors.xaml", UriKind.Relative) };
ResourceDictionary yellowDict = new ResourceDictionary() { Source = new Uri(@"/Styles/Colors/Yellow/YellowColors.xaml", UriKind.Relative) };
ResourceDictionary genericDict = new ResourceDictionary() { Source = new Uri(@"/Styles/Colors/GenericColors.xaml", UriKind.Relative) };
在MainWindow上我有一个ComboBox,它存储三个枚举值"蓝色,绿色,黄色和#34;。这是所选索引发生变化时的作用:
Application.Current.Resources.MergedDictionaries.Clear();
Themes newTheme = (Themes)cbxThemes.SelectedItem;
if (newTheme == currentTheme)
return;
switch (newTheme)
{
case Themes.Blue:
Application.Current.Resources.MergedDictionaries.Add(blueDict);
break;
case Themes.Green:
Application.Current.Resources.MergedDictionaries.Add(greenDict);
break;
case Themes.Yellow:
Application.Current.Resources.MergedDictionaries.Add(yellowDict);
break;
default:
break;
}
Application.Current.Resources.MergedDictionaries.Add(genericDict);
currentTheme = newTheme;
第一次,一切运作良好,我可以选择我想要的颜色,但是当我再次改变颜色时,没有任何反应。
有什么东西在后台没有更新吗?
代码有效,如果您输出Application.Current.Resources.MergedDictionaries
,您甚至可以看到新来源。只有UI不会更新。
答案 0 :(得分:1)
我找到了解决方案:
简单地替换
Application.Current.Resources.MergedDictionaries.Add(yourDictionary);
带
Application.Current.Resources.MergedDictionaries.Add(new ResourceDictionary() { Source = new Uri(@"yourPath.xaml", UriKind.Relative) });
通常在编程中我不知道它为什么会起作用,但首先我很高兴。如果有人可以向我解释,那就太好了。
答案 1 :(得分:0)
尝试替换此行:
Themes newTheme = (Themes)cbxThemes.SelectedItem;
这一行:
string newTheme = ((ComboBoxItem)cbxThemes.SelectedItem).Content.ToString();
当然,你还需要改变你如何处理新主题和当前主题之间的比较。
如果您不想使用字符串,可以使用以下命令将其转换为枚举:
Themes newTheme;
Enum.TryParse(((ComboBoxItem)cbxThemes.SelectedItem).Content.ToString(), out newTheme);