按名称访问ResourceDictionary

时间:2014-04-16 07:15:56

标签: c# .net wpf vb.net resourcedictionary

假设我的Application.xaml中有一些ResourceDictionary定义如下:

<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

2 个答案:

答案 0 :(得分:2)

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

将您的字典设为资源:

enter image description here

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

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

(来自文档Merged Resource Dictionaries

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

对于设计时,你肯定会想要在XAML中声明字典的默认行为,那么你在运行时可以做的就是删除所有字典并使用上面的方法重新加载它们。

答案 1 :(得分:0)

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

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

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

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