我有一个WPF UserControls库,以及一个在库内共享的ResourceDictionary。

该库中的所有UserControls仅出现在单个“ 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。但是每个控件现在都需要引用此词典,我认为这是没有必要的。

有什么想法吗,我是在做奇怪的事情还是对行为的期望不正确?

最佳答案

尽管文档有点不透明,但对here进行了描述。如果您在不指定键的情况下将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>

关于wpf - 在UserControl中引用 parent 的ResourceDictionary,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4847335/

10-11 02:24