UWP是否有可能取代点击测试?

时间:2018-09-26 12:02:47

标签: uwp hittest

我写WPF用户界面已经多年了。

使用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框架中找不到与上述类似的方法,因此我怀疑UWP中不提供“命中测试覆盖”。

有人可以告诉我这种方法是否仍可以在UWP中使用吗?如果没有,我是否可以使用另一种方法来获得相同的结果?

谢谢

编辑:示例

我们假设彼此顶部有2个图像控件,最上面的控件是中间带孔的黄色圆圈图像,最下面的图像是蓝色的实心正方形,上面的控件完全覆盖了该图像,但是可以从圆孔中部分看到。

现在,我希望能够a)通过单击圆形的黄色部分来移动该圆形,或者b)通过在圆形孔中单击来从下方移动蓝色方块。

好。当我将鼠标移到黄色圆圈上时,它将触发PointerMoved事件,然后我可以确定鼠标是否在PNG图像蒙版的一部分上。到目前为止一切顺利。

现在让我们说鼠标在圆心上的孔上,我真的很想开始从正方形而不是圆上接收所有的Pointer和Manipulation事件。我能想到的唯一方法是,每当鼠标悬停在图像的“孔”部分上时,在圆圈上设置属性“ IsHitTestVisible = false”,然后每当鼠标悬停在圆圈上时,在圆圈上设置“ IsHitTestVisible = true”图片的“黄色”部分。

这种方法的问题在于,一旦我在圆上设置了“ IsHitTestVisible = false”,它就不会再引发其他PointerMoved事件。

换句话说,现在开始更改PointerMoved事件中的IsHitTestVisible属性为时已晚,因此为什么能够在WPF中覆盖HitTestCore是如此有用,因为这是在引发Pointer事件之前发生的。

因此,现在我知道在UWP中无法使用HitTestCore覆盖(说实话,这真是太可惜了),还有其他方法可以实现我所描述的内容吗?例如,当第一个控件引发指针事件和触摸事件时,我可以将它们转发到第二个控件上吗?在这样做时,第一个控件也可以忽略这些事件吗?

欢迎提出任何想法

1 个答案:

答案 0 :(得分:0)

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

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

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