ResourceDictionary в ресурсах приложения не может быть найден

У меня возникла странная проблема с ResourceDictionary в моем Application.Resources. Чтобы заполнить несколько 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 выше, словаря, решает проблему.

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


person Christoph    schedule 21.03.2011    source источник
comment
Вместо этого вы можете использовать расширение разметки x: Array. Это позволяет вам определять списки элементов в XAML.   -  person CodeNaked    schedule 21.03.2011


Ответы (2)


Это потому, что если у вас есть словарь ресурсов как единственный элемент в разделе ресурсов, тогда содержимое просто добавляется в родительский словарь (I подглядывал, и, похоже, это так). Чтобы обойти это, вам нужно поместить свой словарь ресурсов в отдельный файл 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}}"/>
person Leom Burke    schedule 21.03.2011

Спасибо за Ваш ответ. В моем реальном приложении я создал этот отдельный файл, но я не сделал в нем второй 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>

Так что это, конечно, тоже не сработало.

Спасибо за ответ, определенно решает этот вопрос.

person Christoph    schedule 21.03.2011
comment
Спасибо, рад, что это сработало - Быстрый указатель на будущее - вам нужно отметить ответ как принятый, и ваш «ответ» должен быть комментарием к моему. Это не то же самое, что форум :) - person Leom Burke; 22.03.2011