UWP 是否可以覆盖命中测试?

5

我从撰写多年WPF UI转移到UWP。

对于WPF控件,可以通过覆盖控件的HitTestCore方法来提供自定义命中测试逻辑,方法如下:

protected override HitTestResult HitTestCore(PointHitTestParameters params)
{
    //Do some kind of test on params.HitPoint
    if (HitPointIsOverTheControl(params.HitPoint))
        return new PointHitTestResult(this, params.HitPoint);
    else
        return null;
}

我一直成功地使用这种方法来测试鼠标是否在任何不规则PNG图像上(在图像控件中),通过测试当前鼠标点下方的图像像素,以查看其alpha通道字节值是否为0,如果是,则在以上函数中返回null。
换句话说,这种方法允许我遍历PNG alpha通道掩码到它下面的可见控件堆栈中的任何内容。而且它运作得非常好。
现在转到UWP ...
我找不到与上述类似的方法,在UWP框架中,所以我怀疑'hit test overriding'在UWP中不可用。
有人可以告诉我这种方法在UWP中是否仍然可行?如果不行,是否有其他方法可以实现相同的结果?
谢谢
编辑:示例
假设有两个彼此重叠的图像控件,最上面的控件是一个带有中间孔的黄色圆形图像,底部图像是一个实心的蓝色正方形,完全被上面的控件覆盖,但可以从圆孔中部分地看到。
现在我想要a)通过单击其黄色部分移动圆形或b)通过圆孔中的点击移动底部的蓝色正方形。
好了。当我将鼠标移动到黄色圆圈上方时,它会触发PointerMoved事件,然后我可以决定鼠标是否在PNG图像掩码的一部分上。到目前为止还不错。
现在假设鼠标悬停在圆中间的孔上,我真的想开始从正方形接收所有指针和操作事件,而不是从圆形接收。我能想到的唯一方法是在鼠标悬停在图像的'孔'部分时,在圆形上设置属性'IsHitTestVisible=false',并在鼠标悬停在图像的'黄色'部分时,在圆形上设置属性'IsHitTestVisible=true'。
这种方法的问题在于,一旦我在圆形上设置了'IsHitTestVisible=false',它就不会再触发进一步的PointerMoved事件。
换句话说,在PointerMoved事件中开始更改IsHitTestVisible属性为时已晚,因此重写WPF中的HitTestCore非常有用,因为它在引发Pointer事件之前发生。
现在我知道在UWP中不可用HitTestCore覆盖(说实话真是太遗憾了),是否还有其他方法来实现我所描述的内容?例如,当第一个控件引发它们时,我是否可以将指针事件和触摸事件转发到第二个控件,并在这样做时也忽略第一个控件的事件?
欢迎任何想法。

你找到方法来做这件事了吗?谢谢。 - martial
抱歉,不行。回复迟了,非常抱歉。 - NigelP
1个回答

0

UWP Image 控件是密封类,无法继承,并且在 Image 控件中没有 HitTestCore 方法。对于您的要求,您可以处理 PointerMoved 事件,该事件可以监视控件命中区域内的鼠标移动并获取当前位置。

private void Image_PointerMoved(object sender, PointerRoutedEventArgs e)
{
    var point = e.GetCurrentPoint(sender as UIElement).Position;

    System.Diagnostics.Debug.WriteLine(point.ToString());
}

谢谢你的回复,Nico,但这并不是我想要的。我已经在我的帖子中编辑了一个示例场景。如果你有任何其他想法,欢迎分享。 - NigelP
UIElement 还具有 PointerEnteredPointerExited 事件,您可以在这些事件处理程序中设置 IsHitTestVisible。有关更多详细信息,请参阅此文档 - Nico Zhu
谢谢Nico。这是一个部分解决方案。它适用于单击/拖动场景,但对于鼠标悬停/反馈场景来说不太适用,因为需要在鼠标移动到任何对象之前动态地打开和关闭命中测试的方式。但PointerEntered/Exited给了我一些我需要的东西。 - NigelP

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接