3

我在我的顶级控件的 XAML 中作为 MergedDictionary 加载的 ResourceDictionary 中定义了一组样式和画笔:

<ResourceDictionary.MergedDictionaries>
     <ResourceDictionary Source="/MyAssembly;component/Styles.xaml"/>
</ResourceDictionary.MergedDictionaries>

如果 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 知道我的默认样式,但允许我在运行时使用动态加载的资源字典选择性地覆盖它们?谢谢!

4

1 回答 1

1

这是一个解决方案,其中颜色/画笔与绑定一起应用,而不是直接引用静态资源: http:
//blogs.msdn.com/corrinab/archive/2009/11/24/9927729.aspx
第二部分:
http:// /blogs.msdn.com/corrinab/archive/2009/12/02/9931283.aspx

目前我认为这样的事情是在运行时处理动态切换主题的最佳方式。但是移植现有应用程序以使用这样的机制确实需要大量工作。

于 2010-01-21T11:46:42.807 回答