【问题标题】:Replacing Merged Resource Dictionaries on Load of Silverlight Application在加载 Silverlight 应用程序时替换合并的资源字典
【发布时间】:2023-09-17 18:06:01
【问题描述】:

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

【问题讨论】:

    标签: c# silverlight expression-blend resourcedictionary mergeddictionaries


    【解决方案1】:

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

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

    【讨论】:

    • 这不是我真正想要的方式(这似乎应该用资源而不是绑定画笔来解决)......但它似乎是动态样式的最佳解决方法我已经看过了,所以我会将其标记为已回答。
    最近更新 更多