WPF触摸抬起事件在启用父级操作时未触发

7

我有一个Canvas,上面有一个子控件。子控件可以正常接收所有的PreviewTouchDown和PreviewTouchUp事件 - 但是在启用Canvas的Manipulation (IsManipulationEnabled = true)后,只有“down”事件能够触发子对象,而TouchUp和PreviewTouchUp事件则根本不会触发。

这里有什么问题吗?

2个回答

7
您需要在子元素上设置IsManipulationEnabledtrue。关于触摸和操作事件之间的关系,请参阅输入概述/触摸和操作,第触摸和操作事件之间的关系部分:

UIElement始终可以接收触摸事件。当设置IsManipulationEnabled属性为true时,UIElement可以接收触摸和操作事件。如果未处理TouchDown事件(即Handled属性为false),操作逻辑会将触摸捕获到元素并生成操作事件。如果在TouchDown事件中将Handled属性设置为true,则操作逻辑不会生成操作事件。下图显示了触摸事件和操作事件之间的关系。

触摸和操作事件

Touch and manipulation events


那么没有获取它们两个的选项吗? - Jaska
刚刚发现了自己的一些代码,其中我手动从“PreviewTouchDown”处理程序中调用了“CaptureTouch”,同时还设置了“Handled = true”。还有一个“PreviewTouchUp”处理程序。不幸的是,我现在无法测试它,但明天我会试一试。 - Clemens
好的,如果您能做到那就太棒了...但是如果太麻烦也没关系,因为我已经放弃使用操作并决定在touchmove事件中自己计算比例和旋转。 - Jaska
刚刚进行了一个快速测试。如果在子元素上设置 IsManipulationEnabled = true,它将获取所有触摸(当然还有操作)事件。 - Clemens
链接到“触摸和操作事件之间的关系”部分:https://learn.microsoft.com/zh-cn/dotnet/desktop/wpf/advanced/input-overview#the-relationship-between-touch-and-manipulation-events - Lyndon Gingerich

3

对于一个解决方法,如果父元素设置了IsManipulationEnabled = true,你就可以很好地捕获"Stylus tap"事件:

....

MyChildElement.StylusSystemGesture += MyChildElement_StylusSystemGesture;
    
....
    
void MyChildElement_StylusSystemGesture(object sender, StylusSystemGestureEventArgs e)
    {
        if (e.SystemGesture == SystemGesture.Tap)
            //Do something
    }

一年后,你拯救了我的理智!终于,我可以检测到启用操作的元素上的“点击”。一个包含的按钮甚至无法检测到点击,但触笔手势却可以。 - ulatekh

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