假设我的Application.xaml中有一些资源字典,定义如下:
<Application>
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary x:Name="brushResources"/>
<ResourceDictionary x:Name="graphicsResources"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
</Application>我本以为我可以简单地访问下面代码中的字典:
brushResources.MergedDictionaries.Add(someNewBrushes)
graphicsResources.MergedDictionaries.Add(someNewGraphics)但情况似乎并非如此,这是处理ResourceDictionary的错误方法吗?我非常喜欢用MEF动态加载资源的能力,对我来说,这似乎是一个绊脚石。
编辑
修正了显示字典的示例代码实际上在MergedDictionaries中
发布于 2014-04-16 17:10:14
由于您不能为此类资源定义键或名称,因此需要执行以下操作:
让你的字典成为一个资源:

载入你的字典,保持对它的引用,并做任何你必须做的事情。
// Load the dictionary
ResourceDictionary resourceDictionary = null;
var resourceStream = Application.GetResourceStream(new Uri("ResourceDictionary1.xaml", UriKind.Relative));
if (resourceStream != null && resourceStream.Stream != null)
{
using (XmlReader xmlReader = XmlReader.Create(resourceStream.Stream))
{
resourceDictionary = XamlReader.Load(xmlReader) as ResourceDictionary;
}
}然后将其添加到应用程序中:
// Merge it with the app dictionnaries
App.Current.Resources.MergedDictionaries.Add(resourceDictionary);(来自docs 合并资源词典)
这完全复制了原始行为,但现在您可以访问字典了。
对于设计时,您肯定希望在XAML中声明字典的默认行为,那么在运行时您可以做的是删除所有字典并使用上面的方法重新加载它们。
发布于 2014-04-16 07:27:43
您可以使用FrameworkElement.TryFindResource。如果您在后面的窗口代码中,请执行以下操作:
var myResource = (ResourceDictionary) this.TryFindResource("someResourceName")如果找不到资源,则返回null。
http://msdn.microsoft.com/en-us/library/system.windows.frameworkelement.tryfindresource.aspx
https://stackoverflow.com/questions/23102504
复制相似问题