合并资源词典

时间:2010-04-12 13:38:19

标签: c# wpf styles resourcedictionary

我正在尝试将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 个答案:

答案 0 :(得分:8)

您不能使用Source属性从代码加载资源字典。

来自MSDN

  

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

因此,一些伪代码:

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

Here is another example如何做到这一点:

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);