Can anyone explain on how to detect simple touch gestures in a WinRT app? I tried using the GestureRecognizer
class but it didn't work:
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"); }
A touch gesture is used for interacting with a touch-enabled device to enhance the experience with it.
A "touch gesture" occurs when a user places one or more fingers on the touch screen, and your application interprets that pattern of touches as a particular gesture. There are correspondingly two phases to gesture detection: Gather data about touch events.
Open the Settings app. Scroll through the options and tap on Display settings. Look for and open the Navigation bar option. Tap on Swipe gestures.
 Gestures are scripted “solutions” that take advantage of these touch events.  So instead of tracking two touch points to determine if they're moving away or closer to one another in order to manipulate the size of a photo, you can just use GESTURE_ZOOM.
If you will notice the MainPage Class has its own Manipulation Events which you can use without creating a seperate GestureRecognizer
. You can enable it by setting this.ManipulationMode
to ManipulationModes.All
. This will allow you to see responses on the MainPages Tapped
, RightTapped
, ManipulationStarting
, ManipulationStarted
, ManipulationDelta
and ManipulationCompleted
Events.
As far as getting the GestureRecongnizer to work according to this Blog and this MSDN Forum Posting you will need to handle the MainPage's PointerMoved
, PointerReleased
and PointerPressed
events like so.
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; } }
According to the Documentation you need to enable the CrossSlide Event by adding it to your GestureRecongnizer and setting up the CrossSlideThresholds and Direction. From last link:
CrossSlide must be set in the GestureSettings property to support CrossSliding. CrossSliding distance thresholds are disabled by default. Use CrossSlideThresholds to set these values.
example:
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;
and make sure it is added to your 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;
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With