【问题标题】:Access ResourceDictionary by name按名称访问资源字典
【发布时间】:2014-04-16 07:15:56
【问题描述】:

假设我的 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 中的示例代码

【问题讨论】:

  • @Aybe 遗憾的是,我已经尝试了 FindResource 和 TryFindResource 的键,甚至 FindName 的名称,但没有任何解决方案。

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


【解决方案1】:

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

让你的字典成为资源:

加载你的字典,保留对它的引用,然后用它做任何你需要做的事情。

// 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 中声明字典的默认行为,然后在运行时您可以做的是删除所有字典并使用上述方法重新加载它们。

【讨论】:

    【解决方案2】:

    您可以使用FrameworkElement.TryFindResource。如果你在一个窗口代码后面,这样做:

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

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

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

    【讨论】:

    • 我之前尝试过,但没有运气,我确实使用了 x:Key 而不是 x:Name。我总是得到一个空值,如果你在 Application.Resources 中声明你的字典,你是否有机会验证这对你有用?
    猜你喜欢
    • 2013-01-28
    • 1970-01-01
    • 2012-02-11
    • 2015-06-12
    • 2013-04-28
    • 1970-01-01
    • 2011-04-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多