按名称访问ResourceDictionary

可以说我的Application.xaml中有一些ResourceDictionary定义如下:

          

我原以为我可以简单地在后面的代码中访问字典,如下所示:

 brushResources.MergedDictionaries.Add(someNewBrushes) graphicsResources.MergedDictionaries.Add(someNewGraphics) 

但这似乎并非如此,这是处理ResourceDictionary的错误方法吗? 我真的很喜欢用MEF动态加载资源的能力,这对我来说似乎是一个绊脚石。

编辑

修复了显示字典实例在MergedDictionaries中的示例代码

由于您无法为此类资源定义密钥或名称,因此您需要执行以下操作:

使您的字典成为资源:

在此处输入图像描述

加载你的字典,保留它的引用,并做任何与它有关的事情。

 // 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 Merged Resource Dictionaries )

这完全复制了原始行为,但现在您可以访问字典。

对于设计时,您肯定需要在XAML中声明字典的默认行为,然后在运行时可以执行的操作是删除所有字典并使用上述方法重新加载它们。

您可以使用FrameworkElement.TryFindResource 。 如果您在窗口代码后面,请执行以下操作:

 var myResource = (ResourceDictionary) this.TryFindResource("someResourceName") 

如果找不到资源,则返回null。

http://msdn.microsoft.com/en-us/library/system.windows.frameworkelement.tryfindresource.aspx