ResourceDictionary в ресурсах приложения не может быть найден - PullRequest
1 голос
/ 21 марта 2011

Я столкнулся с какой-то странной проблемой с ResourceDictionary в моем Application.Resources. Чтобы заполнить несколько полей со списком внутри моего приложения, я хочу сохранить данные в 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.

Ответы [ 2 ]

4 голосов
/ 21 марта 2011

Это потому, что если у вас есть словарь ресурсов в качестве единственного элемента в разделе ресурсов, то содержимое просто добавляется в родительский словарь (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}}"/>
0 голосов
/ 21 марта 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>

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

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

...