合并资源字典

7
我正在尝试在代码后台合并WPF资源字典,但由于某些原因,这不起作用。如果我尝试在文档本身上合并字典,例如:

,它可以运行:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WpfApplication212;assembly=WpfApplication212">

<ResourceDictionary.MergedDictionaries>
    <ResourceDictionary Source="Theme.xaml"></ResourceDictionary>
</ResourceDictionary.MergedDictionaries>

<Style TargetType="{x:Type local:URComboBox}" BasedOn="{StaticResource ComboBoxStyle}">
</Style>

这个正常工作,但如果我注释掉ResourceDictionary.MergedDictionaries并尝试在代码中使用这个:
ResourceDictionary skin = new ResourceDictionary();
skin.Source = styleLocation;
ResourceDictionary skinFather = new ResourceDictionary();
skinFather.MergedDictionaries.Add(skin);
skinFather.Source = styleLocationFather;

这将会失败,因为找不到资源。


1
"styleLocation"和"styleLocationFather"分别是什么意思? - Reed Copsey
1个回答

9

您无法使用Source属性从代码中加载资源字典。

来自MSDN

“合并的字典可以通过代码添加到资源字典中。任何资源属性的默认初始空ResourceDictionary也具有默认的初始空MergedDictionaries集合属性。要通过代码添加合并的字典,您需要获取对所需主ResourceDictionary的引用,获取其MergedDictionaries属性值,并在其中包含的通用集合上调用Add。您添加的对象必须是新的ResourceDictionary。在代码中,您不设置Source属性。相反,您必须通过创建或加载ResourceDictionary对象来获取ResourceDictionary对象。加载现有ResourceDictionary的一种方法是在具有ResourceDictionary根的现有XAML文件流上调用XamlReader.Load,然后将XamlReader.Load返回值转换为ResourceDictionary。”

因此,以下是一些伪代码:

ResourceDictionary myResourceDictionary = XamlReader.Load(someXamlStreamReader);
anotherResourceDictionary.MergedDictionaries.Add(myResourceDictionary);

以下是另一个关于如何实现的例子:点击这里

Uri uri = new Uri("/PageResourceFile.xaml", UriKind.Relative);
StreamResourceInfo info = Application.GetResourceStream(uri);
System.Windows.Markup.XamlReader reader = new System.Windows.Markup.XamlReader();
Page page = (Page)reader.LoadAsync(info.Stream);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接