1

我的 Application.Resources 中的 ResourceDictionary 遇到了一些奇怪的问题。为了在我的应用程序中填充多个组合框,我想将数据存储在 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}}" />

由于一些幸运的情况,我发现在 Dictionary上方放置另一个资源(如 Style)可以解决问题。

<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 中的资源的理解是错误的。

4

2 回答 2

4

这是因为如果您有一个资源字典作为资源部分中的唯一项目,那么内容就会简单地添加到父字典中(我窥探过,这似乎是这种情况)。要解决此问题,您需要将资源字典放在单独的 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}}"/>
于 2011-03-21T10:42:13.767 回答
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>

所以这当然也不起作用。

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

于 2011-03-21T20:20:43.567 回答