在UserControl中引用Parent的ResourceDictionary

时间:2011-01-31 03:20:17

标签: wpf xaml user-controls resourcedictionary

我有一个WPF UserControls库和一个在库中共享的ResourceDictionary。

此库中的所有UserControl仅出现在单个“shell”父控件中,该控件实际上只是一组较小控件的容器。当我添加以下XAML

时,我能够按预期从我的shell控件访问ResourceDictionary
<Control.Resources>
    <ResourceDictionary Source="MyResources.xaml" />
</Control.Resources>

但是,我无法从位于“shell”控件内的子控件访问ResourceDictionary。

我的印象是WPF应该在本地检查资源,然后向上遍历,直到找到适当的资源?

相反,我正在

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

显然,我可以(和我)在我的子控件中引用ResourceDictionary;但现在每个控件都需要引用这个字典,我认为这不是必需的。

任何想法,我做的事情是奇怪还是我对行为的期望不正确?

1 个答案:

答案 0 :(得分:5)

正在进行的是here,虽然文档有点不透明。如果在没有指定密钥的情况下向元素的ResourceDictionary属性添加Resources,则WPF希望您合并资源字典,并使用其{{1}中的字典内容填充字典。属性。它忽略MergedDictionaries的实际内容,没有密钥。

所以你想做的是:

ResourceDictionary

修改

一个工作示例:

MainWindow.xaml:

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

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

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