2010-08-16 68 views
1

我有一个简单的WPF应用程序用于实验。更改ResourceDictionary不会影响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> 
+0

制作新的ResourceDictionary(在代码中)并调用ApplyTemplate()成功应用主题/样式 - 但不是所有控件。 – 2010-08-16 05:13:39

回答

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; 
} 

,我会reccommend WPF themes。它引入了一个ThemeManager类和一组真正令人难以置信的内置主题。如果在安装或添加新主题时遇到困难,请联系我:)

+0

很酷 - 谢谢!让我检查一下。 – 2010-08-16 03:10:31

+0

嗯 - 似乎没有为我工作 - 是我如何在xaml中指定ResourceDictionary? (我已经将它添加到问题 - 对不起,这不是在这台机器上,所以不容易复制整个代码) – 2010-08-16 03:35:07

+0

AAh kk我得到了你。问题是,这个解决方案是为了将主题应用程序广泛应用。有几件事要检查。首先,验证您是否收到资源字典。其次,用WPFui.winMain.Resources替换App.Current.Resouces。您想要清除您在该特定窗口中拥有的资源。我会推荐广泛应用风格的应用程序。您可以通过使用Application.Resources来完成此操作。 – TerrorAustralis 2010-08-16 05:23:26