WPF嵌套自定义UserControl时无法定位内部TestStyle资源的问题排查
问题分析与解决方案
这个问题的核心是你错误的XAML结构导致TestStyle资源没有被正确纳入Test控件的资源字典中,进而在引用Test控件的MainScreen里找不到该资源。
问题出在哪?
你当前的Test控件XAML里,把<Grid>作为UserControl的直接子元素,之后才写<UserControl.Resources>节点——这违反了WPF XAML的元素结构规则:
UserControl的Content属性只能接受单个子元素(也就是你的<Grid>),而Resources是UserControl的属性节点,它应该被放在Content节点的前面,或者作为UserControl的属性存在,不能和Content平级。- 虽然设计器和编译可能暂时不报错,但这种写法会导致
TestStyle并没有被真正添加到Test控件的资源字典中,当你在MainScreen里引用Test时,控件内部的资源查找逻辑就会失败。
修正后的Test控件XAML
把UserControl.Resources节点移到<Grid>前面,确保结构正确:
<UserControl x:Class="MyProject.Screens.Test" 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" xmlns:local="clr-namespace:MyProject.Screens" mc:Ignorable="d" d:DesignHeight="300" d:DesignWidth="300"> <UserControl.Resources> <Style x:Key="TestStyle" TargetType="{x:Type Button}"> <Setter Property="Padding" Value="1"/> </Style> </UserControl.Resources> <Grid> <Button Style="{StaticResource TestStyle}"/> </Grid> </UserControl>
为什么这样改就有效?
在WPF的XAML语法中,元素的属性节点(比如Resources)需要放在元素的内容节点(这里就是作为Content的<Grid>)之前,这样WPF解析器才能正确识别并将资源添加到控件的资源字典中。当Test控件被正确解析后,它内部的Button就能正常找到TestStyle,MainScreen引用时自然也不会再报错。
内容的提问来源于stack exchange,提问作者AndrewR
相关产品推荐
相关产品推荐

