WPF ResourceDictionary DynamicResource

时间:2016-02-12 18:01:56

标签: .net wpf vb.net

我的问题是我正在尝试使用不同的颜色集从WPF DrawingImage加载几个ResourceDirectory。使用StaticResourceDynamicResource解析这些颜色失败。

有问题的ResourceDirectory永远不会是WPF环境的一部分(因此任何Window或应用程序都是如此),因为这在我的情况下不起作用。而是字典加载代码,管理任何查询。

现在的问题是我基本上有三本词典。两个用于颜色(两个不同的调色板)和一个包含DrawingImage定义。两个颜色词典都包含具有相同名称的资源。

所以我的计划是加载DrawingImage字典,一旦完成,就应用我需要的颜色字典作为合并字典。它失败了。我还尝试将两个字典作为合并字典添加到父级dictonary。那也失败了。

我尝试了两种方式加载词典:

Dim palette As New ResourceDictionary()
palette.Source = New Uri("...", UriKind.Relative)

Dim location As New Uri("...", UriKind.Relative)
Dim palette = DirectCast(Application.LoadComponent(location), ResourceDictionary)

两者产生相同的结果。如果我使用DynamicResource并且这些资源都解析为null,则会加载资源字典。我认为问题是DynamicResource查找资源的方法。但是我找不到将这些查找更改/重定向到我的资源字典的方法。

有没有办法改变DynamicResource的查找?或者有其他方式来存档我需要的东西吗?

有一件事:由于我开发了一个在更大的第三方应用程序中运行的库,因此我无法使用全局应用程序资源字典。

1 个答案:

答案 0 :(得分:0)

事实证明这个问题有一个解决方案。如果应用了搜索上下文,则使用DynamicResource有效。有两个类可用作此扩展的搜索上下文。 FrameworkElementFrameworkContentElement

解决方案是创建其中一个并将所有相关词典应用于这些类。完成此操作后,DynamicResource已正确解析。

Dim drawings As New ResourceDictionary()
drawings.Source = New Uri("...", UriKind.Relative)

Dim palette As New ResourceDictionary()
palette.Source = New Uri("...", UriKind.Relative)

result.MergedDictionaries.Add(drawings)
result.MergedDictionaries.Add(palette)
Dim fe As New FrameworkElement()
fe.Resources = result

将字典分配给FrameworkElement的资源后,可以按预期获取资源。