WPF色彩主题

时间:2017-08-23 13:56:26

标签: c# wpf

我有一个简单的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不会更新。

2 个答案:

答案 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);