我有一组的样式和刷子在我加载如在我的顶层控制的XAML一个MergedDictionary ResourceDictionary中定义:

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

我想的可选的替代其中的一些风格和刷子是否有不同的XAML文件中有自己的ResourceDictionary的XAP存在。我想之前的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的默认样式,我无法打开混合项目。任何人有,将让我知道混合,但让我选择地在运行时用动态加载的资源字典覆盖它们的默认样式的解决方案的任何想法?谢谢!

有帮助吗?

解决方案

下面是其中的颜色/电刷与绑定,而不是直接指的是静态资源施加的溶液:结果 http://blogs.msdn.com/corrinab/archive/一十一分之二千零九/ 24 / 9927729.aspx 结果 第二部分:结果 http://blogs.msdn.com/corrinab/archive/一十二分之二千零九/ 02 / 9931283.aspx

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top