在Silverlight应用程序加载中替换合并资源字典

时间:2009-12-18 19:59:16

标签: c# silverlight expression-blend resourcedictionary mergeddictionaries

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

1 个答案:

答案 0 :(得分:1)

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

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