WPF资源字典查找规则

问题描述 投票:0回答:1

我有两个资源文件(资源字典)

  • Brushes.xaml:包含一些画笔
  • Templates.xaml :包含一些静态引用(StaticResource)中的键的模板
    Brushes.xaml

如果在我的主窗口中,我会这样做:

<Grid>
    <Grid.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="Brushes.xaml" />
                <ResourceDictionary Source="Templates.xaml" />
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Grid.Resources>
    <StackPanel>
        <ContentControl ContentTemplate="{StaticResource TemplateA}"
                        Height="25" />
        <ContentControl ContentTemplate="{StaticResource TemplateB}"
                        Height="25" />
    </StackPanel>

</Grid>

生成模板时找不到画笔。

如果我将资源加载移动到

App.xaml
,它就可以工作。

为什么两种情况下资源查找规则不同?

我也很惊讶地发现以下也失败了?

 <Window.Resources>
     <SolidColorBrush x:Key="BrushA">Red</SolidColorBrush>
     <SolidColorBrush x:Key="BrushB">Green</SolidColorBrush>
 </Window.Resources>

 <Grid>
     <Grid.Resources>
         <ResourceDictionary>
             <ResourceDictionary.MergedDictionaries>
                 <ResourceDictionary Source="Templates.xaml" />
             </ResourceDictionary.MergedDictionaries>
         </ResourceDictionary>
     </Grid.Resources>
     <StackPanel>
         <ContentControl ContentTemplate="{StaticResource TemplateA}"
                         Height="25" />
         <ContentControl ContentTemplate="{StaticResource TemplateB}"
                         Height="25" />
     </StackPanel>

 </Grid>

Grid
Window
的孩子,那为什么它爬上树时找不到画笔呢?

我能找到的有关查找规则的唯一信息如下,但我不确定它是否能回答我的问题https://learn.microsoft.com/en-us/dotnet/desktop/wpf/systems/xaml-resources -merged-dictionaries?view=netdesktop-8.0

wpf resourcedictionary staticresource
1个回答
0
投票

AFAIU,从一个资源(资源A)到其他资源(资源B)的查找不是在使用资源A的地方完成的,而是在定义资源A的地方完成的。所以,这取决于Brushes.xaml中的资源(资源B)是否可以从Templates.xaml中的资源(资源A)访问。

对于 Grid.Resources,Brushes.xaml 中的资源只能从 Grid 中的资源/元素访问,而 Templates.xaml 不在 Grid 中。这同样适用于 Window.Resources。相反,在 Application.Resources 的情况下,可以从整个应用程序(包括 Templates.xaml)访问 Brushes.xaml 中的资源。

© www.soinside.com 2019 - 2024. All rights reserved.