我有两个资源文件(资源字典)
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
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 中的资源。