2011-01-31 4 views
4

У меня есть библиотека WPF UserControls и ResourceDictionary, которые совместно используются в библиотеке.Ссылка на ресурс родителя в WordControl

Все UserControls в этой библиотеке отображаются только в пределах одного родительского элемента «shell», который на самом деле является только контейнером для коллекции меньших элементов управления. Я в состоянии получить доступ к ResourceDictionary из моего контроля оболочки, как и ожидалось, когда я добавить следующий код XAML

<Control.Resources> 
    <ResourceDictionary Source="MyResources.xaml" /> 
</Control.Resources> 

Однако я не могу получить доступ к ResourceDictionary из дочерних элементов управления, которые сидят внутри контроля «оболочки».

У меня создалось впечатление, что WPF должен проверять локально ресурсы, а затем переходить вверх, пока не будут найдены соответствующие ресурсы?

Вместо этого я получаю

Cannot find resource named '{BoolInverterConverter}'. 
Resource names are case sensitive. Error at  
    object 'System.Windows.Data.Binding' in markup file... 

Очевидно, что я могу (и я), ссылающийся на ResourceDictionary в своих дочерних элементов управления; но каждый элемент управления теперь должен ссылаться на этот словарь, и я полагал, что это не обязательно.

Любые идеи, я делаю что-то странное, или мое ожидание неправильного поведения?

ответ

4

Что происходит, описано here, хотя документация немного непрозрачна. Если вы добавите ResourceDictionary в свойство элемента Resources без указания ключа, WPF ожидает, что вы сходите в словарях ресурсов, и заполняет словарь содержимым словарей в свойстве MergedDictionaries. Он игнорирует фактическое содержимое ResourceDictionary без ключа.

Так что вы хотите сделать это:

<Control.Resources> 
    <ResourceDictionary> 
     <ResourceDictionary.MergedDictionaries> 
     <ResourceDictionary Source="MyResources.xaml"/> 
     </ResourceDictionary.MergedDictionaries> 
    </ResourceDictionary> 
</Control.Resources> 

Edit:

Рабочий пример:

MainWindow.xaml:

<Window x:Class="MergedDictionariesDemo.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:MergedDictionariesDemo="clr-namespace:MergedDictionariesDemo" Title="MainWindow" Height="350" Width="525"> 
    <Window.Resources> 
     <ResourceDictionary> 
      <ResourceDictionary.MergedDictionaries> 
       <ResourceDictionary Source="Dictionary1.xaml" /> 
      </ResourceDictionary.MergedDictionaries> 
     </ResourceDictionary> 
    </Window.Resources> 
    <Grid> 
     <MergedDictionariesDemo:UserControl1 /> 
    </Grid> 
</Window> 

Dictionary1.xaml :

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <SolidColorBrush x:Key="UCBrush" 
        Color="Bisque" /> 
</ResourceDictionary> 

UserControl1.xaml:

<UserControl x:Class="MergedDictionariesDemo.UserControl1" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      mc:Ignorable="d" 
      d:DesignHeight="300" d:DesignWidth="300"> 
    <Border Margin="10" BorderBrush="Navy" BorderThickness="1" CornerRadius="10"> 
     <TextBlock Margin="10" 
        Background="{DynamicResource UCBrush}"> 
      The background of this is set by the resource UCBrush. 
     </TextBlock> 

    </Border> 
</UserControl> 
+0

Спасибо за ваш ответ; к сожалению, это дает тот же результат «Не могу найти ресурс ...» в качестве моего исходного XAML. Я экспериментирую с использованием Keys, но не нахожу успеха. Какая часть ссылки на документацию описывает, что происходит - я ее прочитал, и, хотя она имеет отношение к ResourceDictionaries, я не видел ничего особенного в том, доступны ли ресурсы в иерархии элементов управления. –

+1

В параграфе после введения, который начинается «Обратите внимание, что ResourceDictionary не имеет директивы x: Key ...». Вы пытаетесь получить ресурс с помощью расширения разметки «StaticResource»? Потому что это не сработает. 'DynamicResource' будет. –

+0

Robert - Я смотрел на ваше решение - хотя использование DynamicResource работает - компилятор выдает ошибку времени компиляции, указывающую Resource - ресурс xxx не может быть разрешен. То же самое можно воспроизвести и с помощью вашего кода. Есть предположения? – Patrick

Смежные вопросы