我从撰写多年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覆盖(说实话真是太遗憾了),是否还有其他方法来实现我所描述的内容?例如,当第一个控件引发它们时,我是否可以将指针事件和触摸事件转发到第二个控件,并在这样做时也忽略第一个控件的事件?
欢迎任何想法。