Ссылка ResourceDictionary для родителя в UserControl - PullRequest
4 голосов
/ 31 января 2011

У меня есть библиотека WPF UserControls и ResourceDictionary, общий для этой библиотеки.

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

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

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

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

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

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

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

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

1 Ответ

5 голосов
/ 31 января 2011

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

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

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

Редактировать:

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

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