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