【问题标题】:WPF Color ThemeWPF 颜色主题
【发布时间】:2017-08-23 13:56:26
【问题描述】:

我有一个简单的 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,它存储三个枚举值“Blue、Green、Yellow”。这就是所选索引发生变化时的作用:

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 没有更新。

【问题讨论】:

标签: c# wpf


【解决方案1】:

我找到了解决办法:

简单替换

Application.Current.Resources.MergedDictionaries.Add(yourDictionary);

Application.Current.Resources.MergedDictionaries.Add(new ResourceDictionary() { Source = new Uri(@"yourPath.xaml", UriKind.Relative) });

在编程中,我经常不知道它为什么会起作用,但首先我很高兴。如果有人可以向我解释这一点,那就太好了。

【讨论】:

  • 你已经将一个新的资源对象添加到MergedDictionaries,所以资源字典会更新键和值,所以它可以应用新的值。但这是一个坏主意 - 这意味着您将始终添加一个新对象,并留下永远不会在资源字典中使用的旧数据。
【解决方案2】:

尝试替换这一行:

Themes newTheme = (Themes)cbxThemes.SelectedItem;

用这一行:

string newTheme = ((ComboBoxItem)cbxThemes.SelectedItem).Content.ToString();

当然,您还需要更改处理 newTheme 和 currentTheme 之间比较的方式。

如果您不想使用字符串,可以使用以下方法将其转换为枚举:

Themes newTheme;
Enum.TryParse(((ComboBoxItem)cbxThemes.SelectedItem).Content.ToString(), out newTheme);

【讨论】:

  • 无法将“StyleThemes.Themes”类型的对象转换为“System.Windows.Controls.ComboBoxItem”类型。我设置 cbxThemes.ItemsSource = Enum.GetValues(typeof(Themes));所以这些项目是主题的类型。
  • @j.zeddi 然后,不要像上面那样转换为 ComboBoxItem,而是使用:cbxThemes.SelectedValue.ToString()
  • hm...没有例外,但仍然是同样的问题。
  • 是的,这也适用于我,但在我的情况下,颜色不会更新。当我用调试器检查我的代码时,一切看起来都应该
  • @j.zeddi 哦,所以它会弹出到正确的开关并完成添加?这很奇怪。因为您说它在您第一次更改颜色时起作用,但在那之后就不起作用了,我假设 if 语句没有通过并返回。但如果它没有并且它确实添加了相应的,那就很奇怪了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-08
  • 2016-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-01
  • 2011-05-11
相关资源
最近更新 更多