无法找到应用程序资源中的ResourceDictionary

时间:2011-03-21 10:21:22

标签: wpf xaml resources resourcedictionary staticresource

我的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}}" />

由于一些幸运的情况,我能够发现将另一个资源(如上面的 解决了这个问题。

<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>

“bug”出现在WPF应用程序以及Silverlight中。

虽然我可以使用显示的“技巧”来解决这个问题,但我很好奇这个错误的来源。我无法找到任何关于此的内容。也许只是我和我对WPF资源的错误认识。

2 个答案:

答案 0 :(得分:4)

这是因为如果你有一个资源字典作为资源部分中的唯一项目,那么内容只是被添加到父字典(I 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}}"/>

答案 1 :(得分:0)

感谢您的回答。 在我的实际应用程序中,我创建了分隔文件,但我没有在其中创建第二个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>

所以这当然也不起作用。

感谢您的回答,绝对解决了这个问题。