合并资源词典

Joã*_*iro 7 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>
Run Code Online (Sandbox Code Playgroud)

这是有效的,但如果我评论ResourceDictionary.MergedDictionaries并在代码中尝试这样:

ResourceDictionary skin = new ResourceDictionary();
skin.Source = styleLocation;
ResourceDictionary skinFather = new ResourceDictionary();
skinFather.MergedDictionaries.Add(skin);
skinFather.Source = styleLocationFather;
Run Code Online (Sandbox Code Playgroud)

这会因为无法找到资源而中断.

And*_*uus 8

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

来自MSDN:

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

因此,一些伪代码:

ResourceDictionary myResourceDictionary = XamlReader.Load(someXamlStreamReader);
anotherResourceDictionary.MergedDictionaries.Add(myResourceDictionary);
Run Code Online (Sandbox Code Playgroud)

这是另一个如何做到的例子:

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);
Run Code Online (Sandbox Code Playgroud)