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;

这将中断,因为找不到资源。

4

1 回答 1

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

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

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);
于 2010-06-23T11:16:25.590 回答