WPF下,控件未响应鼠标属性触发器

Posted on 2020-06-19 20:33  云起  阅读(22)  评论(0编辑  收藏  举报  来源

WPF下,控件未响应鼠标属性触发器

记一次自定义控件调试

使用WPF写了个自定义控件,其中有个Button按钮,重写了样式模板

<Button Width="50" Height="25" Foreground="Black">
    <Button.Template>
        <ControlTemplate>
            <Border x:Name="clearborder" SnapsToDevicePixels="True">
                <Path x:Name="xx" Stroke="{TemplateBinding Foreground}">
                    <Path.Style>
                        <Style TargetType="Path">
                            <Setter Property="Data" Value="M1.25,6.75 L6.75,1.25 M1.25,1.25 L6.75,6.75"></Setter>
                            <Setter Property="HorizontalAlignment" Value="Center" />
                            <Setter Property="VerticalAlignment" Value="Center" />
                            <Setter Property="Shape.StrokeEndLineCap" Value="Round" />
                        </Style>
                    </Path.Style>
                </Path>
            </Border>
            <ControlTemplate.Triggers>
                <Trigger Property="IsMouseOver" Value="True">
                    <Setter TargetName="clearborder" Property="Background" Value="Blue"></Setter>
                    <Setter TargetName="xx" Property="Stroke" Value="Yellow"></Setter>
                </Trigger>
            </ControlTemplate.Triggers>
        </ControlTemplate>
    </Button.Template>
</Button>

问题现象

使用时发生了一个奇怪的现象,鼠标只有很靠近path的时候,背景色才会变化。

问题分析

监视了属性的变化,确实只有鼠标移动到path附近的时候,IsMouseOver属性才变为True。
为什么鼠标已经移动到Button内但是IsMouseOver属性却没有变化呢?
原因在于没有为Border设置默认的背景色。当Border的背景色没有设置时,其属性值为Null,当控件调用InputHitTest方法检测时,会直接跳过,所以影响到鼠标事件的响应。

解决方式

改进方法也很简单,设置Border的背景色为Transparent,透明背景的控件依然会被hit test检测到,所以能正常响应鼠标事件,显示上也不会受影响。

相似问题
Hit Test说明

Copyright © 2024 云起
Powered by .NET 9.0 on Kubernetes