WinUI3桌面应用中能否在VisualState的Setter里使用TemplateBinding?
WinUI3桌面应用VisualState中TemplateBinding失效问题
我在WinUI3桌面应用中尝试通过TemplateBinding将VisualState里的属性值绑定到模板化FrameworkElement的属性,但未生效——无报错也无结果。以下是实现代码:
C#自定义控件代码
public class ButtonEx : Button { public ButtonEx() : base() { } public static readonly DependencyProperty BackgroundPointerOverProperty = DependencyProperty.Register( "BackgroundPointerOver", typeof(SolidColorBrush), typeof(ButtonEx), new PropertyMetadata(null)); public SolidColorBrush BackgroundPointerOver { get => (SolidColorBrush)GetValue(BackgroundPointerOverProperty); set => SetValue(BackgroundPointerOverProperty, value); } }
控件模板XAML代码
<ControlTemplate TargetType="classes:ButtonEx"> <Grid x:Name="LayoutRoot" > <VisualStateManager.VisualStateGroups> <VisualStateGroup x:Name="CommonStates"> <VisualState x:Name="Normal" /> <VisualState x:Name="PointerOver"> <VisualState.Setters> <Setter Target="LayoutRoot.Background" Value="{TemplateBinding BackgroundPointerOver}" /> </VisualState.Setters> </VisualState> </VisualStateGroup> </VisualStateManager.VisualStateGroups> </Grid> </ControlTemplate>
按预期,PointerOver状态时Setter应将ButtonEx的背景设置为BackgroundPointerOver属性值,为何未生效?
问题原因
WinUI3中TemplateBinding无法在VisualState.Setters的Setter.Value中正常工作。这是因为TemplateBinding的解析时机是模板初始化阶段,而VisualState的Setter是在状态切换时才触发应用,此时TemplateBinding无法正确关联到控件的依赖属性。
解决方案
使用{RelativeSource TemplatedParent}绑定替代TemplateBinding,它能在VisualState切换时正确解析到模板化父控件的属性:
修改后的VisualState代码:
<VisualState x:Name="PointerOver"> <VisualState.Setters> <Setter Target="LayoutRoot.Background" Value="{Binding BackgroundPointerOver, RelativeSource={RelativeSource TemplatedParent}}" /> </VisualState.Setters> </VisualState>
同时需要确保:
- 使用ButtonEx时已正确设置
BackgroundPointerOver属性值,示例:
<classes:ButtonEx BackgroundPointerOver="Red" Content="测试按钮" />
- 若使用颜色字符串,WinUI3会自动转换为SolidColorBrush,也可显式指定
<SolidColorBrush Color="Red"/>。
内容的提问来源于stack exchange,提问作者aturnbul
相关产品推荐
相关产品推荐

