我在ResourceDictionary中定义了一组样式和画笔,我将其作为顶级控件的XAML中的MergedDictionary加载:
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="/MyAssembly;component/Styles.xaml"/>
</ResourceDictionary.MergedDictionaries>
我正在尝试选择替换其中一些样式&amp;如果XAP中存在具有自己的ResourceDictionary的不同XAML文件,则刷子。我试图在运行时合并此字典,然后在我的用户控件上调用InitializeComponent()。我使用以下代码尝试执行此操作:
public static class StyleLoader
{
public static void MergeStyle(string xamlUri)
{
try
{
XDocument xaml = XDocument.Load(xamlUri);
ResourceDictionary rd = XamlReader.Load(xaml.ToString()) as ResourceDictionary;
Application.Current.Resources.MergedDictionaries.Add(rd);
}
catch (XmlException ex)
{
// if the file doesn't exist, we can't add it
}
}
}
可选文件中的资源字典被正确加载并合并,但我的原始样式集似乎总是覆盖它。如果我在XAML中注释掉合并的字典,只需在运行时加载它们就可以完美地运行:
StyleLoader.MergeStyle("/MyAssembly;component/Styles.xaml");
StyleLoader.MergeStyle("BrushReplacements.xaml");
InitializeComponent();
我对此解决方案的问题是,如果没有XAML中的默认样式,我无法在Blend中打开该项目。任何人都有一个解决方案的想法,将我的默认样式保持为Blend,但允许我在运行时使用动态加载的资源字典选择性地覆盖它们?谢谢!
答案 0 :(得分:1)
这是一个解决方案,其中颜色/画笔使用绑定而不是直接引用静态资源:
http://blogs.msdn.com/corrinab/archive/2009/11/24/9927729.aspx
第二部分:
http://blogs.msdn.com/corrinab/archive/2009/12/02/9931283.aspx
目前我认为这样的事情是在运行时动态切换主题的最佳方式。但它需要大量工作来移植现有的应用程序以使用这样的机制。