You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 18:46:19