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

UWP是否可以覆盖命中测试?,uwp,hittest,Uwp,Hittest,我是从写WPF UI的几年后来到UWP的 使用WPF控件,可以通过覆盖控件的HitTestCore方法来提供自定义命中测试逻辑,如下所示: protected override HitTestResult HitTestCore(PointHitTestParameters params) { //Do some kind of test on params.HitPoint if (HitPointIsOverTheControl(params.HitPoint))

我是从写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框架中找不到与上述类似的方法,因此我怀疑UWP中没有“命中测试覆盖”

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

谢谢

编辑:示例

让我们假设上面有2个图像控件,最上面的控件是一个黄色圆圈的图像,中间有一个孔,底部的图像是一个实心的蓝色正方形,完全被顶部控件覆盖,但是可以通过圆孔中的一部分看到。 现在,我希望能够a)通过单击圆的黄色部分移动圆,或者b)通过单击圆中的孔从下方移动蓝色正方形

嗯。当我将鼠标移到黄色圆圈上时,它会触发PointerMoved事件,然后我可以确定鼠标是否位于PNG图像遮罩的一部分上。到目前为止还不错

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

这种方法的问题是,只要我在圆上设置'ishitsetvisible=false',它将不再引发进一步的PointerMoved事件

换句话说,现在开始修改PointerMoved事件中的IshittesVisible属性为时已晚,因此在WPF中重写HitTestCore非常有用,因为这发生在引发指针事件之前

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

任何受欢迎的想法

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

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

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

谢谢你的回复尼科,但这并没有给我我想要的。我用一个示例场景编辑了我的文章。如果您有任何其他想法,它们将是最受欢迎的
UIElement
还具有
PointerEntered
PointerExited
事件,您可以在这些事件处理程序中设置
ishitestvisible
。关于更多细节,你可以参考这个。谢谢尼科。这是部分解决方案。它适用于单击/拖动场景,但不适用于鼠标悬停/反馈场景,因为在单击任何对象之前,需要有一种方法在鼠标在对象上移动时打开和关闭点击测试。但是PointerEntered/Exited给了我一些我需要的东西你找到方法了吗?谢谢第二位教授。对延迟回复表示歉意。