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检测到,所以能正常响应鼠标事件,显示上也不会受影响。