检测简单触摸手势

任何人都可以解释如何在WinRT应用程序中检测简单的触摸手势? 我尝试使用GestureRecognizer类,但它不起作用:

  public MainPage() { this.InitializeComponent(); Windows.UI.Input.GestureRecognizer gr = new Windows.UI.Input.GestureRecognizer(); gr.CrossSliding += gr_CrossSliding; gr.Dragging += gr_Dragging; gr.Holding += gr_Holding; gr.ManipulationCompleted += gr_ManipulationCompleted; gr.ManipulationInertiaStarting += gr_ManipulationInertiaStarting; gr.ManipulationStarted += gr_ManipulationStarted; gr.ManipulationUpdated += gr_ManipulationUpdated; gr.RightTapped += gr_RightTapped; gr.Tapped += gr_Tapped; gr.GestureSettings = Windows.UI.Input.GestureSettings.ManipulationRotate | Windows.UI.Input.GestureSettings.ManipulationTranslateX | Windows.UI.Input.GestureSettings.ManipulationTranslateY | Windows.UI.Input.GestureSettings.ManipulationScale | Windows.UI.Input.GestureSettings.ManipulationRotateInertia | Windows.UI.Input.GestureSettings.ManipulationScaleInertia | Windows.UI.Input.GestureSettings.ManipulationTranslateInertia | Windows.UI.Input.GestureSettings.Tap; } void gr_Tapped(Windows.UI.Input.GestureRecognizer sender, Windows.UI.Input.TappedEventArgs args) { Debug.WriteLine("gr_Tapped"); } void gr_RightTapped(Windows.UI.Input.GestureRecognizer sender, Windows.UI.Input.RightTappedEventArgs args) { Debug.WriteLine("gr_RightTapped"); } void gr_Holding(Windows.UI.Input.GestureRecognizer sender, Windows.UI.Input.HoldingEventArgs args) { Debug.WriteLine("gr_Holding"); } void gr_Dragging(Windows.UI.Input.GestureRecognizer sender, Windows.UI.Input.DraggingEventArgs args) { Debug.WriteLine("gr_Dragging"); } void gr_CrossSliding(Windows.UI.Input.GestureRecognizer sender, Windows.UI.Input.CrossSlidingEventArgs args) { Debug.WriteLine("gr_CrossSliding"); } void gr_ManipulationUpdated(Windows.UI.Input.GestureRecognizer sender, Windows.UI.Input.ManipulationUpdatedEventArgs args) { Debug.WriteLine("gr_ManipulationUpdated"); } void gr_ManipulationStarted(Windows.UI.Input.GestureRecognizer sender, Windows.UI.Input.ManipulationStartedEventArgs args) { Debug.WriteLine("gr_ManipulationStarted"); } void gr_ManipulationCompleted(Windows.UI.Input.GestureRecognizer sender, Windows.UI.Input.ManipulationCompletedEventArgs args) { Debug.WriteLine("gr_ManipulationCompleted"); } void gr_ManipulationInertiaStarting(Windows.UI.Input.GestureRecognizer sender, Windows.UI.Input.ManipulationInertiaStartingEventArgs args) { Debug.WriteLine("gr_ManipulationInertiaStarting"); } 

如果您注意到MainPage类有自己的操作事件,您可以使用它而无需创建单独的GestureRecognizer 。 您可以通过将this.ManipulationMode设置为ManipulationModes.All来启用它。 这将允许您查看MainPages RightTappedRightTappedManipulationStartingManipulationStartedManipulationDeltaManipulationCompleted Events的响应。

至于让GestureRecongnizer根据这个博客和这个MSDN论坛发布工作,你将需要处理MainPage的PointerMovedPointerReleasedPointerPressed事件。

 Windows.UI.Input.GestureRecognizer gr = new Windows.UI.Input.GestureRecognizer(); public MainPage() { this.InitializeComponent(); this.PointerPressed += MainPage_PointerPressed; this.PointerMoved += MainPage_PointerMoved; this.PointerReleased += MainPage_PointerReleased; gr.CrossSliding += gr_CrossSliding; gr.Dragging += gr_Dragging; gr.Holding += gr_Holding; gr.ManipulationCompleted += gr_ManipulationCompleted; gr.ManipulationInertiaStarting += gr_ManipulationInertiaStarting; gr.ManipulationStarted += gr_ManipulationStarted; gr.ManipulationUpdated += gr_ManipulationUpdated; gr.RightTapped += gr_RightTapped; gr.Tapped += gr_Tapped; gr.GestureSettings = Windows.UI.Input.GestureSettings.ManipulationRotate | Windows.UI.Input.GestureSettings.ManipulationTranslateX | Windows.UI.Input.GestureSettings.ManipulationTranslateY | Windows.UI.Input.GestureSettings.ManipulationScale | Windows.UI.Input.GestureSettings.ManipulationRotateInertia | Windows.UI.Input.GestureSettings.ManipulationScaleInertia | Windows.UI.Input.GestureSettings.ManipulationTranslateInertia | Windows.UI.Input.GestureSettings.Tap; } void MainPage_PointerReleased(object sender, PointerRoutedEventArgs e) { var ps = e.GetIntermediatePoints(null); if (ps != null && ps.Count > 0) { gr.ProcessUpEvent(ps[0]); e.Handled = true; gr.CompleteGesture(); } } void MainPage_PointerMoved(object sender, PointerRoutedEventArgs e) { gr.ProcessMoveEvents(e.GetIntermediatePoints(null)); e.Handled = true; } void MainPage_PointerPressed(object sender, PointerRoutedEventArgs e) { var ps = e.GetIntermediatePoints(null); if (ps != null && ps.Count > 0) { gr.ProcessDownEvent(ps[0]); e.Handled = true; } } 

根据文档,您需要通过将CrossSlide事件添加到GestureRecongnizer并设置CrossSlideThresholds和Direction来启用它。 从上一个链接:

必须在GestureSettings属性中设置CrossSlide才能支持CrossSliding。 默认情况下禁用CrossSliding distance阈值。 使用CrossSlideThresholds设置这些值。

例:

 Windows.UI.Input.CrossSlideThresholds cst = new Windows.UI.Input.CrossSlideThresholds(); cst.SelectionStart = 2; cst.SpeedBumpStart = 3; cst.SpeedBumpEnd = 4; cst.RearrangeStart = 5; gr.CrossSlideHorizontally = true; gr.CrossSlideThresholds = cst; gr.CrossSliding += gr_CrossSliding; 

并确保它已添加到您的GestureSettings

 gr.GestureSettings = Windows.UI.Input.GestureSettings.ManipulationRotate | Windows.UI.Input.GestureSettings.ManipulationTranslateX | Windows.UI.Input.GestureSettings.ManipulationScale | Windows.UI.Input.GestureSettings.ManipulationRotateInertia | Windows.UI.Input.GestureSettings.ManipulationScaleInertia | Windows.UI.Input.GestureSettings.ManipulationTranslateInertia | Windows.UI.Input.GestureSettings.Tap | Windows.UI.Input.GestureSettings.CrossSlide;