我正在尝试将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;
这会因为无法找到资源而中断。
答案 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);