【问题标题】:Changing ResourceDictionary doesn't visably affect Window in WPF更改 ResourceDictionary 不会明显影响 WPF 中的 Window
【发布时间】:2010-08-16 02:05:49
【问题描述】:

我有一个用于试验的简单 WPF 应用程序。

我在单独的 xaml 文件中定义了两个主题,将 xaml 更改为指向它们工作正常。顺便说一句,在 xaml 中,我使用的是直接的 ResourceDictionary 元素,而不是 ResourceDictionary.MergedDictionaries 元素。

我想让用户选择要使用的主题,所以我在后面的代码中重置了源属性 - 但是调试器告诉我我已经成功设置了应用程序外观不会改变的值。

那么,如何在运行时成功应用主题?

编辑:这就是我在 xaml 中声明我的“风格”的方式:

<Window x:Class="WpfUI.winMain">
  <Window.Resources>
    <ResourceDictionary Source="Themes\Blah.xaml"></ResourceDictionary>
  </Window.Resources>

  // The windows grid and other controls...

</Window>

【问题讨论】:

  • 创建一个新的 ResourceDictionary(在代码中)并调用 ApplyTemplate() 成功地应用了主题/样式 - 但不是在所有控件上。

标签: wpf resources runtime


【解决方案1】:

简单的答案是,您需要清除应用程序合并的资源字典。这是一些帮助您入门的代码

ResourceDictionary dictionary = GetThemeResourceDictionary(yourTheme) 

if (dictionary != null)
{
     App.Current.Resources.MergedDictionaries.Clear();
     App.Current.Resources.MergedDictionaries.Add(dictionary);
}

public ResourceDictionary GetThemeResourceDictionary(string theme)
{
    if (theme != null)
    {
        Assembly assembly = Assembly.LoadFrom("WPF.Themes.dll");
        string packUri = String.Format(YourThemeFolder/{0}.xaml", theme);
        return Application.LoadComponent(new Uri(packUri, UriKind.Relative)) as ResourceDictionary;
    }
    return null;
}

如果您想要一个非常好的打包解决方案,我会推荐WPF themes。它引入了一个 ThemeManager 类和一组真正令人难以置信的内置主题。如果您在安装或添加新主题时遇到任何困难,请联系我:)

【讨论】:

  • 嗯 - 似乎对我不起作用 - 这是我在 xaml 中指定 ResourceDictionary 的方式吗? (我已经将它添加到问题中 - 抱歉它不在这台机器上,所以不容易复制整个代码)
  • 啊,我明白了。问题是,此解决方案旨在广泛应用主题应用程序。有几件事要检查。首先,验证您是否正在获取资源字典。其次,将 App.Current.Resouces 替换为 WPFui.winMain.Resources。您想清除该特定窗口上的资源。我建议在广泛的范围内应用样式应用程序。您可以使用 Application.Resources 来做到这一点。
  • 是的,我正在取回 RD,是的,样式正在被应用——但并非始终如一。稍后我会进行更多实验并提出更多问题:)
  • 检查未应用样式的控件。告诉我这些模式是否为真:为控制定义了显式模板。都是相同的类型(例如,所有按钮都没有得到样式)。 IF 1) 那么它的样式优先级问题。如果为 2,则检查样式以查看应用的样式是否具有键和类型
  • 仅供参考 - 我使用 Style="{StaticResource ...}" 而我应该使用 Style="{DynamicResource ...}"
猜你喜欢
  • 1970-01-01
  • 2017-06-29
  • 2010-12-24
  • 1970-01-01
  • 2018-12-16
  • 1970-01-01
  • 1970-01-01
  • 2011-03-10
  • 1970-01-01
相关资源
最近更新 更多