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

Nig*_*elP 5 hittest uwp

我在编写 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;
}
Run Code Online (Sandbox Code Playgroud)

我一直在成功地使用这种方法,通过测试当前鼠标点正下方的图像像素以查看它是否具有 alpha 通道字节,可以测试鼠标是否位于任何不规则形状的 PNG 图像(在图像控件中)上值为 0,如果是,则在上述函数中返回 null。

换句话说,这种方法允许我通过 PNG Alpha 通道蒙版选择可见控件堆栈中位于其下方的任何内容。而且效果出奇的好。

现在到 UWP...

我在 UWP 框架中找不到与上述类似的方法,因此我怀疑“命中测试覆盖”在 UWP 中不可用。

谁能告诉我这种方法在 UWP 中是否仍然可行,如果不行,是否有其他方法可以用来实现相同的结果?

谢谢

编辑:示例

假设有 2 个图像控件彼此重叠,最上面的控件是一个中间有孔的黄色圆圈的图像,底部的图像是一个实心蓝色正方形,它完全被顶部控件覆盖,但可以部分覆盖。透过圆圈中的洞看到。

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

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

现在假设鼠标位于圆中间的孔上方,我真的想开始接收来自正方形而不是圆的所有指针和操作事件。我能想到的唯一方法是,每当鼠标位于图像的“洞”部分上方时,在圆圈上设置属性“IsHitTestVisible = false”,并在鼠标悬停时在圆圈上设置“IsHitTestVisible = true”图像的“黄色”部分。

这种方法的问题是,一旦我在圆圈上设置“IsHitTestVisible=false”,它将不再引发进一步的 PointerMoved 事件。

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

所以现在我知道 HitTestCore 覆盖在 UWP 中不可用(说实话,这是一个真正的耻辱),还有其他方法可以实现我所描述的吗?例如,当第一个控件引发指针事件和触摸事件时,我是否可以将它们转发到第二个控件,并且这样做也会使第一个控件忽略这些事件?

欢迎任何想法

Nic*_*SFT 0

UWPImage控件是密封类,不能继承,控件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());
}
Run Code Online (Sandbox Code Playgroud)