前文再续,书接上一回。
上回说到Windows10手势分为高中低三个档次,于是心血来潮想要研究一下这三个等级的操作顺序是如何的?Manipulation手势的几个事件的触发顺序又是怎么样的,什么时候触发Starting,什么时候触发Started?UserControl自身有一个虚方法:OnManipulationStarting,OnManipulationStarted,它同时又有ManipulationStarted,ManipulationStarted事件,为什么功能类似的东西要有不同的方式,他们的触发顺序是什么?于是这些问题就构成了今天的这篇文章。
简单地来说,这篇文章是为了解决以下的几个问题:
1. PointerPressed,ManipulationStarting,Tapped事件的触发顺序
2. UserControl的重写方法:MainPage_ManipulationStarting(), MainPage_ManipulationStarted() 与UserControl的ManipulationStarting,ManipulationStarted事件的注册方法的执行顺序
3. ManipulationStarting、ManipulationStarted的触发条件。
第一个问题:
这个只需要写个比较简单的Demo,就可以把这个顺序找出来:PointerPressed会先被触发,ManipulationStarting次之,只有手指或者鼠标放开的时候才会触发Tapped事件。关于Tapped事件值得一说的是:MSDN给出的解释是:因为有其他手收例如Holding,在手指按下的时候,你是不能确定是什么事件会被触发的,只有手指松开之后,才会根据相应的条件判断到底是什么事件。
从结果上来看,PointerPressed事件会被首先触发,有点出乎我的意料,因为MSDN上给出的ManipulationStarting的解释是:这个时间会启动Manipulation Processor,看来这个意思是这个Manipulation Processor是监控Manipulation 系列事件的。
毕竟PointerPressed与ManipulationStarting都是属于Framwork层的时间,应该是框架决定的这个顺序。
但是这三个事件是平行的事件,即,不论哪个事件被标记为处理过,即e.Handled = true,都不会影响其他两个事件,而只会影响事件不会继续路由下去。
第二个问题:
研究这个问题是出于我的好奇心,同样作用的东西,为什么要有两种形式?说实话,我不知道为什么,MSDN好像也没有给出一个明确的答案,它只是说,OnManipulationStarting represents a prewired event handler for the UIElement.ManipulationStarting event.这个重载方法会在事件之前被调用,而且这个方法在其他所有Manipulation事件触发之前执行,这样你就可以通过控制event Data来控制手势事件的路由了。
还是没说为什么要有这个方法。。。
但是这解决了第二个问题的第二个问题,执行顺序的问题,重写方法会首先执行,然后才是控件的相应事件被触发,不仅仅是Starting哦,你如果不信,可以去试试,Delta,Completed都是一样的。
第三个问题:
之前有个同事问我,Win10上怎么在手点击在屏幕上就能捕获这个事件,并且获得这个点,感觉ManipulationStarted事件不是很灵敏啊。确实不敏感,我决定先从ManipulationStarted事件说起:ManipulationStarted represents that the manipulation recognition logic has detected pointer movement. 。看到没有:检测到移动,就是说,必须要移动一下,才会触发这个事件。
但是PC与Phone又有不一致的情况:PC上使用鼠标,按下之后不动,也会触发ManipulationStarted事件,同样的,Phone上就不会,你必须按下后稍微移动一下,才会触发ManipulationStarted事件。此处有很多点,如果知道答案的朋友可以告诉我
OK,说回ManipulationStarting:Occurs when the manipulation processor is first created.就是说这个事件会触发操作处理器被调起,并且监控触发后续的事件。通俗点就是:当你手指点下,这个事件就会被触发,这个事件就能解答同事的疑惑了。
我知道很多朋友是带着上一章的疑问来看这一章的,不好意思发散了一下,答案马上解答。