【问题标题】:Change the hittest area更改热门区域
【发布时间】:2017-01-20 08:00:07
【问题描述】:

想象一下,我将这个椭圆应用于样式的 ControlTemplate。 (例如:这将用于滑块的拇指)

<Ellipse x:Name="Ellipse" 
         Fill="#C0FFFFFF"
         Stroke="{StaticResource SpecialColor}"
         StrokeThickness="2"/>

现在只要鼠标接触到这个椭圆,这个元素就会被鼠标捕获。如何更改碰撞几何?是否有一种仅限 XAML 的方法来执行此操作?

假设我想让碰撞区域更小,以便当鼠标位于椭圆中间时它会捕获它。

或者我想让碰撞区域大于椭圆大小,这样当鼠标靠近椭圆时它会捕获它。

【问题讨论】:

  • 最简单的方法(仅限 XAML)是放置一个稍大(或更小)的椭圆,上面带有 Fill="Transparent"。透明(相对于 null)确实适用于命中测试。
  • 不错的意见,将虚拟椭圆放置得更大更透明。但是椭圆变小了呢?如果我用一些画笔填充外椭圆,它将计入命中测试
  • 正如 Erno 在他的回答中指出的那样,您必须在透明椭圆上处理鼠标事件。将您当前的椭圆视为装饰器,将透明的视为“实际”椭圆。

标签: c# wpf xaml hittest


【解决方案1】:

这些解决方案不会改变椭圆的命中测试,但会尽可能提供 XAML 解决方案。

可以通过将椭圆包装在容器(网格?)中并为容器分配透明背景来使其更大。

<Grid Background="Transparent">
    <Ellipse Margin="5" ... />
</Grid>

可以通过在顶部添加一个较小的几何图形来使其更小,再次使用透明背景并禁用椭圆上的命中测试 (IsHitTestVisible = "False"

<Grid>
    <Ellipse IsHitTestVisible="False" ... />
    <Grid Background="Transparent" Width="5" Height="5" />
</Grid>

重要:

  • 您需要将背景显式设置为透明。
  • 这两种解决方案都不会更改 Ellipse 的命中测试,而是使用“诱饵”,因此您必须实现处理诱饵上的点击等事件并让它们作用于容器。

【讨论】:

    猜你喜欢
    • 2017-08-18
    • 1970-01-01
    • 1970-01-01
    • 2019-04-15
    • 1970-01-01
    • 2018-04-18
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    相关资源
    最近更新 更多