按名称访问ResourceDictionary

6
假设我有一些ResourceDictionary在我的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中。

@Aybe 很遗憾,我已经尝试了使用键值对的FindResource和TryFindResource,甚至是使用名称的FindName,但是没有任何解决方案。 - xvpower
2个回答

2

由于您无法为此类资源定义键或名称,因此这是您需要做的:

使您的字典成为一个资源:

输入图像描述

加载您的字典,保留对其的引用并执行您需要执行的任何操作。

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

(来自文档合并资源字典)

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

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


0

2
我之前尝试过,但没有成功,我使用的是x:Key而不是x:Name。我总是得到一个空值,你能否验证一下如果你在Application.Resources内声明你的字典是否有效? - xvpower

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接