【问题标题】:ResourceDictionary in application resources cannot be found找不到应用程序资源中的 ResourceDictionary
【发布时间】:2011-07-19 13:50:10
【问题描述】:

我的 Application.Resources 中的 ResourceDictionary 遇到了一些奇怪的问题。 为了在我的应用程序中填充多个 ComboBox,我想将数据存储在 ResourceDictionary 中。

但是,我不断收到“找不到具有该名称/密钥的资源...”错误。

我的 XAML 代码在这里:

<Application.Resources>
    <ResourceDictionary x:Key="RDArray">
        <sys:String x:Key="item1">Item1</sys:String>
        <sys:String x:Key="item2">Item2</sys:String>
        <sys:String x:Key="item3">Item3</sys:String>
    </ResourceDictionary>
</Application.Resources>

<ListBox x:Name="lb" ItemsSource="{Binding Values, Source={StaticResource RDArray}}" />

由于一些幸运的情况,我能够发现将其他资源(如 Style) 放在 Dictionary 上可以解决问题。

<Application.Resources>
    <Style x:Key="fubar" />
    <ResourceDictionary x:Key="RDArray">
        <sys:String x:Key="item1">Item1</sys:String>
        <sys:String x:Key="item2">Item2</sys:String>
        <sys:String x:Key="item3">Item3</sys:String>
    </ResourceDictionary>
</Application.Resources>

“错误”出现在 WPF 应用程序和 Silverlight 中。

虽然我可以使用显示的“技巧”解决这个问题,但我很好奇这个错误来自哪里。我无法找到任何关于此的信息。也许这只是我,我对 WPF 中的资源的理解有误。

【问题讨论】:

  • 您可能想改用x:Array 标记扩展。这允许您在 XAML 中定义项目列表。

标签: wpf xaml resources resourcedictionary staticresource


【解决方案1】:

这是因为如果您将资源字典作为资源部分中的唯一项目,那么内容只会被添加到父字典中(我 snooped 似乎是这种情况)。要解决这个问题,您需要将资源字典放在单独的 xaml 文件中(在本例中为 List.xaml):

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                     xmlns:sys="clr-namespace:System;assembly=mscorlib"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <ResourceDictionary x:Key="RDArray">
        <sys:String x:Key="item1">Item1</sys:String>
        <sys:String x:Key="item2">Item2</sys:String>
        <sys:String x:Key="item3">Item3</sys:String>
    </ResourceDictionary>
</ResourceDictionary>

然后在您的主应用程序中引用它:

<Window.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="List.xaml"/>
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Window.Resources>

<ListBox x:Name="lb" ItemsSource="{Binding Values, Source={StaticResource RDArray}}"/>

【讨论】:

    【解决方案2】:

    感谢您的回答。 在我的真实应用程序中,我创建了那个单独的文件,但我没有在其中创建第二个 ResourceDictionary,而是将字符串值放在那里。所以它看起来像:

    <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                     xmlns:sys="clr-namespace:System;assembly=mscorlib"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
        <sys:String x:Key="item1">Item1</sys:String>
        <sys:String x:Key="item2">Item2</sys:String>
        <sys:String x:Key="item3">Item3</sys:String>
    </ResourceDictionary>
    

    所以这当然也不行。

    感谢您的回答,肯定解决了这个问题。

    【讨论】:

    • 谢谢,很高兴它奏效了 - 未来的快速要点 - 您需要将答案标记为已接受,并且您的“答案”应该是对我的评论。它与论坛不同:)
    最近更新 更多