2010-04-12 155 views
7

我想合并后面的代码wpf资源字典,但对于一些reasion这是行不通的。如果我尝试合并在它的运行,例如文档本身的字典:合并资源字典

<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”? – 2010-04-12 15:39:41

回答

6

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

MSDN

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

因此,一些伪代码:

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