2012-10-13 28 views
8

Tôi có đoạn mã sau:Xử lý Hai, Ba, Bốn ngón tay swipe cử chỉ trong WinRT App

private Point initialpoint; 

private void ManipulationStarted(object sender, ManipulationStartedRoutedEventArgs e) 
{ 
    initialpoint = e.Position; 
} 

private void ManipulationDelta(object sender, ManipulationDeltaRoutedEventArgs e) 
{ 
    Point currentpoint = e.Position; 
    if (currentpoint.X - initialpoint.X >= 100) 
    { 
     System.Diagnostics.Debug.WriteLine("Swipe Right"); 
     e.Complete(); 
    } 
} 

tôi có thể xử lý 1 ngón tay swipe cử chỉ rất dễ dàng, nhưng tôi muốn để xử lý 2, 3, 4 ngón tay swipe cũng cử chỉ. Bất cứ ai có thể cho tôi biết làm thế nào để làm điều đó?

Trả lời

12

Theo điều này MSDN Forum Posting, bạn sẽ cần phải sử dụng thông báo pointer. Các tài liệu với làm việc mã ví dụ nằm trong MSDN Library

Từ liên kết cuối cùng:

Một đối tượng con trỏ đại diện cho một duy nhất, đầu vào độc đáo "liên hệ" (một PointerPoint) từ một thiết bị đầu vào (chẳng hạn như một chuột, bút/bút, ngón tay, hoặc nhiều ngón tay). Hệ thống tạo ra một con trỏ khi một liên hệ được phát hiện lần đầu tiên và phá hủy nó khi con trỏ rời khỏi (phát hiện) phạm vi phát hiện hoặc bị hủy bỏ. Trong trường hợp nhiều thiết bị hoặc đầu vào đa chạm, mỗi số liên lạc được coi là một con trỏ duy nhất.


Chỉ cần một caveat, tôi không có một cảm ứng đa thiết bị Windows 8 để kiểm tra mã này vào. Vì vậy, nó đã được thử nghiệm trong Simuator với tất cả các hạn chế của nó, và như đã đề cập trong các liên kết trên Windows 8 không có hỗ trợ cử chỉ để phát hiện nhiều ngón tay, bạn phải sử dụng các chức năng cấp thấp hơn.

Trước hết tôi thêm hai từ điển khác vào mã ví dụ MSDN ở trên và hai biến cho Ngưỡng Swipe của bạn thành định nghĩa Lớp.

Dictionary<uint, Point> startLocation; 
Dictionary<uint, bool> pointSwiped; 
int swipeThresholdX = 100; 
int swipeThresholdY = 100; 

sau đó tôi khởi tạo Dictionarys trong Constructor của Form

startLocation = new Dictionary<uint, Point>((int)SupportedContacts.Contacts); 
pointSwiped = new Dictionary<uint, bool>((int)SupportedContacts.Contacts); 

Sau đó, mọi nơi mà các từ điển gốc đã được thêm vào hoặc đã một mục lấy ra tôi đã làm việc cùng với các mới điển của

thêm:

startLocation[pt.PointerId] = pt.Position; 
pointSwiped[pt.PointerId] = false; 

xóa:

startLocation.Remove(pt.PointerId); 
pointSwiped.Remove(pt.PointerId); 

Sau đó, cuối cùng đặt chúng lại với nhau trong PointerMovedEvent:

private void targetContainer_PointerMoved(object sender, PointerRoutedEventArgs e) 
{ 
    Windows.UI.Input.PointerPoint currentPoint = e.GetCurrentPoint(targetContainer); 
    if (currentPoint.IsInContact) 
    { 
     if (startLocation.ContainsKey(currentPoint.PointerId)) 
     { 
      Point startPoint = startLocation[currentPoint.PointerId]; 
      if (Math.Abs(currentPoint.Position.X - startPoint.X) > swipeThresholdX) // I only did one Axis for testing 
      { 
       pointSwiped[currentPoint.PointerId] = true; 
      } 
     } 
    } 
    updateInfoPop(e); 
}    

cuối cùng Modified MSDN Ví dụ:

using System; 
using System.Collections.Generic; 
using System.IO; 
using System.Linq; 
using Windows.Foundation; 
using Windows.Foundation.Collections; 
using Windows.UI.Xaml; 
using Windows.UI.Xaml.Controls; 
using Windows.UI.Xaml.Controls.Primitives; 
using Windows.UI.Xaml.Data; 
using Windows.UI.Xaml.Input; 
using Windows.UI.Xaml.Media; 
using Windows.UI.Xaml.Navigation; 

// The Blank Page item template is documented at http://go.microsoft.com/fwlink/?LinkId=234238 

namespace PointerInput 
{ 
    /// <summary> 
    /// An empty page that can be used on its own or navigated to within a Frame. 
    /// </summary> 
    public sealed partial class MainPage : Page 
    { 
     Windows.Devices.Input.TouchCapabilities SupportedContacts = new Windows.Devices.Input.TouchCapabilities(); 

     uint numActiveContacts; 
     Dictionary<uint, Windows.UI.Input.PointerPoint> contacts; 
     Dictionary<uint, Point> startLocation; 
     Dictionary<uint, bool> pointSwiped; 
     int swipeThresholdX = 100; 
     int swipeThresholdY = 100; 

     public MainPage() 
     { 
      this.InitializeComponent(); 
      numActiveContacts = 0; 
      contacts = new Dictionary<uint, Windows.UI.Input.PointerPoint>((int)SupportedContacts.Contacts); 
      startLocation = new Dictionary<uint, Point>((int)SupportedContacts.Contacts); 
      pointSwiped = new Dictionary<uint, bool>((int)SupportedContacts.Contacts); 
      targetContainer.PointerPressed += new PointerEventHandler(targetContainer_PointerPressed); 
      targetContainer.PointerEntered += new PointerEventHandler(targetContainer_PointerEntered); 
      targetContainer.PointerReleased += new PointerEventHandler(targetContainer_PointerReleased); 
      targetContainer.PointerExited += new PointerEventHandler(targetContainer_PointerExited); 
      targetContainer.PointerCanceled += new PointerEventHandler(targetContainer_PointerCanceled); 
      targetContainer.PointerCaptureLost += new PointerEventHandler(targetContainer_PointerCaptureLost); 
      targetContainer.PointerMoved += new PointerEventHandler(targetContainer_PointerMoved); 
     } 

     // PointerPressed and PointerReleased events do not always occur in pairs. 
     // Your app should listen for and handle any event that might conclude a pointer down action 
     // (such as PointerExited, PointerCanceled, and PointerCaptureLost). 
     void targetContainer_PointerPressed(object sender, PointerRoutedEventArgs e) 
     { 
      if (Convert.ToBoolean(SupportedContacts.TouchPresent) && (numActiveContacts > SupportedContacts.Contacts)) 
      { 
       // cannot support more contacts 
       eventLog.Text += "\nNumber of contacts exceeds the number supported by the device."; 
       return; 
      } 

      Windows.UI.Input.PointerPoint pt = e.GetCurrentPoint(targetContainer); 

      // Update event sequence. 
      eventLog.Text += "\nDown: " + pt.PointerId; 

      // Change background color of target when pointer contact detected. 
      targetContainer.Fill = new SolidColorBrush(Windows.UI.Colors.Green); 

      // Check if pointer already exists (if enter occurred prior to down). 
      if (contacts.ContainsKey(pt.PointerId)) 
      { 
       return; 
      } 
      contacts[pt.PointerId] = pt; 
      startLocation[pt.PointerId] = pt.Position; 
      pointSwiped[pt.PointerId] = false; 
      ++numActiveContacts; 
      e.Handled = true; 

      // Display pointer details. 
      createInfoPop(e); 
     } 

     private void targetContainer_PointerEntered(object sender, PointerRoutedEventArgs e) 
     { 
      Windows.UI.Input.PointerPoint pt = e.GetCurrentPoint(targetContainer); 

      // Update event sequence. 
      eventLog.Text += "\nOver: " + pt.PointerId; 

      if (contacts.Count == 0) 
      { 
       // Change background color of target when pointer contact detected. 
       targetContainer.Fill = new SolidColorBrush(Windows.UI.Colors.Blue); 
      } 

      // Check if pointer already exists (if enter occurred prior to down). 
      if (contacts.ContainsKey(pt.PointerId)) 
      { 
       return; 
      } 

      // Push new pointer Id onto expando target pointers array. 
      contacts[pt.PointerId] = pt; 
      startLocation[pt.PointerId] = pt.Position; 
      pointSwiped[pt.PointerId] = false; 
      ++numActiveContacts; 
      e.Handled = true; 

      // Display pointer details. 
      createInfoPop(e); 
     } 

     // Fires for for various reasons, including: 
     // - User interactions 
     // - Programmatic caputre of another pointer 
     // - Captured pointer was deliberately released 
     // PointerCaptureLost can fire instead of PointerReleased. 
     private void targetContainer_PointerCaptureLost(object sender, PointerRoutedEventArgs e) 
     { 
      Windows.UI.Input.PointerPoint pt = e.GetCurrentPoint(targetContainer); 

      // Update event sequence. 
      eventLog.Text += "\nPointer capture lost: " + pt.PointerId; 

      if (contacts.ContainsKey(pt.PointerId)) 
      { 
       checkSwipe(); 
       contacts[pt.PointerId] = null; 
       contacts.Remove(pt.PointerId); 
       startLocation.Remove(pt.PointerId); 
       if (pointSwiped.ContainsKey(pt.PointerId)) 
        pointSwiped.Remove(pt.PointerId); 

       --numActiveContacts; 
      } 

      // Update the UI and pointer details. 
      foreach (TextBlock tb in pointerInfo.Children) 
      { 
       if (tb.Name == e.Pointer.PointerId.ToString()) 
       { 
        pointerInfo.Children.Remove(tb); 
       } 
      } 

      if (contacts.Count == 0) 
      { 
       targetContainer.Fill = new SolidColorBrush(Windows.UI.Colors.Black); 
      } 

      e.Handled = true; 
     } 

     // Fires for for various reasons, including: 
     // - A touch contact is canceled by a pen coming into range of the surface. 
     // - The device doesn't report an active contact for more than 100ms. 
     // - The desktop is locked or the user logged off. 
     // - The number of simultaneous contacts exceeded the number supported by the device. 
     private void targetContainer_PointerCanceled(object sender, PointerRoutedEventArgs e) 
     { 
      Windows.UI.Input.PointerPoint pt = e.GetCurrentPoint(targetContainer); 

      // Update event sequence. 
      eventLog.Text += "\nPointer canceled: " + pt.PointerId; 

      if (contacts.ContainsKey(pt.PointerId)) 
      { 
       checkSwipe(); 
       contacts[pt.PointerId] = null; 
       contacts.Remove(pt.PointerId); 
       startLocation.Remove(pt.PointerId); 
       if (pointSwiped.ContainsKey(pt.PointerId)) 
        pointSwiped.Remove(pt.PointerId); 

       --numActiveContacts; 
      } 

      // Update the UI and pointer details. 
      foreach (TextBlock tb in pointerInfo.Children) 
      { 
       if (tb.Name == e.Pointer.PointerId.ToString()) 
       { 
        pointerInfo.Children.Remove(tb); 
       } 
      } 

      if (contacts.Count == 0) 
      { 
       targetContainer.Fill = new SolidColorBrush(Windows.UI.Colors.Black); 
      } 

      e.Handled = true; 
     } 

     private void targetContainer_PointerExited(object sender, PointerRoutedEventArgs e) 
     { 
      Windows.UI.Input.PointerPoint pt = e.GetCurrentPoint(targetContainer); 

      // Update event sequence. 
      eventLog.Text += "\nPointer exited: " + pt.PointerId; 

      if (contacts.ContainsKey(pt.PointerId)) 
      { 
       checkSwipe(); 
       contacts[pt.PointerId] = null; 
       contacts.Remove(pt.PointerId); 
       startLocation.Remove(pt.PointerId); 
       if (pointSwiped.ContainsKey(pt.PointerId)) 
        pointSwiped.Remove(pt.PointerId); 

       --numActiveContacts; 
      } 

      // Update the UI and pointer details. 
      foreach (TextBlock tb in pointerInfo.Children) 
      { 
       if (tb.Name == e.Pointer.PointerId.ToString()) 
       { 
        pointerInfo.Children.Remove(tb); 
       } 
      } 

      if (contacts.Count == 0) 
      { 
       targetContainer.Fill = new SolidColorBrush(Windows.UI.Colors.Gray); 

      } 
      e.Handled = true; 
     } 

     /// <summary> 
     /// Invoked when this page is about to be displayed in a Frame. 
     /// </summary> 
     /// <param name="e">Event data that describes how this page was reached. The Parameter 
     /// property is typically used to configure the page.</param> 
     protected override void OnNavigatedTo(NavigationEventArgs e) 
     { 
     } 

     void targetContainer_PointerReleased(object sender, PointerRoutedEventArgs e) 
     { 
      foreach (TextBlock tb in pointerInfo.Children) 
      { 
       if (tb.Name == e.Pointer.PointerId.ToString()) 
       { 
        pointerInfo.Children.Remove(tb); 
       } 
      } 

      Windows.UI.Input.PointerPoint pt = e.GetCurrentPoint(targetContainer); 

      // Update event sequence. 
      eventLog.Text += "\nUp: " + pt.PointerId; 

      // Change background color of target when pointer contact detected. 
      targetContainer.Fill = new SolidColorBrush(Windows.UI.Colors.Red); 

      if (contacts.ContainsKey(pt.PointerId)) 
      { 
       checkSwipe(); 
       contacts[pt.PointerId] = null; 
       contacts.Remove(pt.PointerId); 
       startLocation.Remove(pt.PointerId); 
       if(pointSwiped.ContainsKey(pt.PointerId)) 
        pointSwiped.Remove(pt.PointerId); 

       --numActiveContacts; 
      } 
      e.Handled = true; 
     } 

     private void targetContainer_PointerMoved(object sender, PointerRoutedEventArgs e) 
     { 
      Windows.UI.Input.PointerPoint currentPoint = e.GetCurrentPoint(targetContainer); 
      if (currentPoint.IsInContact) 
      { 
       if (startLocation.ContainsKey(currentPoint.PointerId)) 
       { 
        Point startPoint = startLocation[currentPoint.PointerId]; 
        if (Math.Abs(currentPoint.Position.X - startPoint.X) > swipeThresholdX) // I only did one Axis for testing 
        { 
         pointSwiped[currentPoint.PointerId] = true; 
        } 
       } 

      } 
      updateInfoPop(e); 
     } 

     int numberOfSwipedFingers() 
     { 
      int count = 0; 
      foreach (var item in pointSwiped) 
      { 
       if (item.Value) { count += 1; } 
      } 
      return count; 
     } 

     void checkSwipe() 
     { 
      int fingers = numberOfSwipedFingers(); 
      if (fingers > 1) 
      { 
       eventLog.Text += "\nNumber of Swiped fingers = " + fingers; 
      } 
      else if (fingers == 1) 
      { 
       eventLog.Text += "\nNumber of Swiped fingers = " + fingers; 
      } 
      if(fingers > 0) 
       pointSwiped.Clear(); 
     }    

     void createInfoPop(PointerRoutedEventArgs e) 
     { 
      Windows.UI.Input.PointerPoint currentPoint = e.GetCurrentPoint(targetContainer); 
      TextBlock pointerDetails = new TextBlock(); 
      pointerDetails.Name = currentPoint.PointerId.ToString(); 
      pointerDetails.Foreground = new SolidColorBrush(Windows.UI.Colors.White); 
      pointerInfo.Children.Add(pointerDetails); 
      pointerDetails.Text = queryPointer(e); 
     } 

     void updateInfoPop(PointerRoutedEventArgs e) 
     { 
      foreach (TextBlock pointerDetails in pointerInfo.Children) 
      { 
       if (pointerDetails.Name == e.Pointer.PointerId.ToString()) 
       { 
        pointerDetails.Text = queryPointer(e); 
       } 
      } 
     } 

     String queryPointer(PointerRoutedEventArgs e) 
     { 
      Windows.UI.Input.PointerPoint currentPoint = e.GetCurrentPoint(targetContainer); 
      String details = ""; 
      switch (e.Pointer.PointerDeviceType) 
      { 
       case Windows.Devices.Input.PointerDeviceType.Mouse: 
        details += "\nPointer type: mouse"; 
        break; 
       case Windows.Devices.Input.PointerDeviceType.Pen: 
        details += "\nPointer type: pen"; 
        if (e.Pointer.IsInContact) 
        { 
         details += "\nPressure: " + currentPoint.Properties.Pressure; 
         details += "\nrotation: " + currentPoint.Properties.Orientation; 
         details += "\nTilt X: " + currentPoint.Properties.XTilt; 
         details += "\nTilt Y: " + currentPoint.Properties.YTilt; 
         details += "\nBarrel button pressed: " + currentPoint.Properties.IsBarrelButtonPressed; 
        } 
        break; 
       case Windows.Devices.Input.PointerDeviceType.Touch: 
        details += "\nPointer type: touch"; 
        details += "\nrotation: " + currentPoint.Properties.Orientation; 
        details += "\nTilt X: " + currentPoint.Properties.XTilt; 
        details += "\nTilt Y: " + currentPoint.Properties.YTilt; 
        break; 
       default: 
        details += "\nPointer type: n/a"; 
        break; 
      } 

      GeneralTransform gt = targetContainer.TransformToVisual(page); 
      Point screenPoint; 

      screenPoint = gt.TransformPoint(new Point(currentPoint.Position.X, currentPoint.Position.Y)); 
      details += "\nPointer Id: " + currentPoint.PointerId.ToString() + 
       "\nPointer location (parent): " + currentPoint.Position.X + ", " + currentPoint.Position.Y + 
       "\nPointer location (screen): " + screenPoint.X + ", " + screenPoint.Y; 
      return details; 
     } 
    } 
} 
+0

@Programmer Vấn đề như Tôi thấy rằng bạn đang phát hành nhiều điểm vào những thời điểm hơi khác nhau, Bạn có lẽ nên quay trở lại thói quen CheckSwipe mà tôi đã có trong ví dụ của tôi và đặt một khóa xung quanh nó hoặc làm một cái gì đó khác để ngăn chặn các ngón tay khác phát hành đầu tiên được thực hiện. Thật không may với giả lập tôi không có cách nào để mô phỏng thêm hai ngón tay được phát hành, và những người cùng một lúc. Tôi sẽ xem xét nó hơn một chút mặc dù –

+0

@Programmer Tôi sẽ xem xét nó, Nó có thể là một ngày hoặc lâu hơn. –

+0

Bạn có thể xem câu hỏi này không? http://stackoverflow.com/questions/13011920/handling-2-3-4-5-fingers-tapped-doubletap-holding-gestures-in-winrt-app – Elmo

1

Tôi thích câu trả lời từ Mark Hall đến một lớp học riêng biệt và để đối phó với swipes lên , xuống, trái và phải.Nó vẫn còn có vấn đề nơi bạn có thể nhấc ngón tay vào những thời điểm khác nhau và nhận được nhiều sự kiện và có thể được cải thiện, mặc dù nó hoạt động cho nhu cầu của tôi:

public enum DirectionSwiped 
{ 
    None, 
    Up, 
    Down, 
    Left, 
    Right 
} 


public class SwipeEventArgs : EventArgs 
{ 
    public DirectionSwiped Direction { get; set; } 
    public int NumberOfTouches { get; set; } 
} 


public class SwipeGestureDetector 
{ 
    public EventHandler<SwipeEventArgs> SwipeDetected; 




    // How much of the grid needs to be covered by the swipe? 
    private const double SWIPE_THRESHOLD = 0.5; 

    // How much drift is allowed in the opposite axis? 
    private const int ALLOWED_DRIFT = 100; 

    Windows.Devices.Input.TouchCapabilities SupportedContacts = new Windows.Devices.Input.TouchCapabilities(); 

    uint numActiveContacts; 
    Dictionary<uint, Windows.UI.Input.PointerPoint> contacts; 
    Dictionary<uint, Point> startLocation; 
    Dictionary<uint, DirectionSwiped> pointSwiped; 

    private Grid mGrid; 





    public SwipeGestureDetector(Grid grid) 
    { 
     mGrid = grid; 

     numActiveContacts = 0; 
     contacts = new Dictionary<uint, Windows.UI.Input.PointerPoint>((int)SupportedContacts.Contacts); 
     startLocation = new Dictionary<uint, Point>((int)SupportedContacts.Contacts); 
     pointSwiped = new Dictionary<uint, DirectionSwiped>((int)SupportedContacts.Contacts); 
     grid.PointerPressed += new PointerEventHandler(Grid_PointerPressed); 
     grid.PointerEntered += new PointerEventHandler(Grid_PointerEntered); 
     grid.PointerReleased += new PointerEventHandler(Grid_PointerReleased); 
     grid.PointerExited += new PointerEventHandler(Grid_PointerExited); 
     grid.PointerCanceled += new PointerEventHandler(Grid_PointerCanceled); 
     grid.PointerCaptureLost += new PointerEventHandler(Grid_PointerCaptureLost); 
     grid.PointerMoved += new PointerEventHandler(Grid_PointerMoved); 
    } 





    // PointerPressed and PointerReleased events do not always occur in pairs. 
    // Your app should listen for and handle any event that might conclude a pointer down action 
    // (such as PointerExited, PointerCanceled, and PointerCaptureLost). 
    void Grid_PointerPressed(object sender, PointerRoutedEventArgs e) 
    { 
     if (Convert.ToBoolean(SupportedContacts.TouchPresent) && (numActiveContacts > SupportedContacts.Contacts)) 
     { 
      // cannot support more contacts 
      Debug.WriteLine("\nNumber of contacts exceeds the number supported by the device."); 
      return; 
     } 

     Windows.UI.Input.PointerPoint pt = e.GetCurrentPoint(mGrid); 

     // Check if pointer already exists (if enter occurred prior to down). 
     if (contacts.ContainsKey(pt.PointerId)) 
     { 
      return; 
     } 
     contacts[pt.PointerId] = pt; 
     startLocation[pt.PointerId] = pt.Position; 
     pointSwiped[pt.PointerId] = DirectionSwiped.None; 
     ++numActiveContacts; 
     e.Handled = true; 
    } 


    private void Grid_PointerEntered(object sender, PointerRoutedEventArgs e) 
    { 
     Windows.UI.Input.PointerPoint pt = e.GetCurrentPoint(mGrid); 

     // Check if pointer already exists (if enter occurred prior to down). 
     if (contacts.ContainsKey(pt.PointerId)) 
     { 
      return; 
     } 

     // Push new pointer Id onto expando target pointers array. 
     contacts[pt.PointerId] = pt; 
     startLocation[pt.PointerId] = pt.Position; 
     pointSwiped[pt.PointerId] = DirectionSwiped.None; 
     ++numActiveContacts; 
     e.Handled = true; 

    } 


    // Fires for for various reasons, including: 
    // - User interactions 
    // - Programmatic caputre of another pointer 
    // - Captured pointer was deliberately released 
    // PointerCaptureLost can fire instead of PointerReleased. 
    private void Grid_PointerCaptureLost(object sender, PointerRoutedEventArgs e) 
    { 
     Windows.UI.Input.PointerPoint pt = e.GetCurrentPoint(mGrid); 

     if (contacts.ContainsKey(pt.PointerId)) 
     { 
      checkSwipe(); 
      contacts[pt.PointerId] = null; 
      contacts.Remove(pt.PointerId); 
      startLocation.Remove(pt.PointerId); 
      if (pointSwiped.ContainsKey(pt.PointerId)) 
       pointSwiped.Remove(pt.PointerId); 

      --numActiveContacts; 
     } 

     e.Handled = true; 
    } 


    // Fires for for various reasons, including: 
    // - A touch contact is canceled by a pen coming into range of the surface. 
    // - The device doesn't report an active contact for more than 100ms. 
    // - The desktop is locked or the user logged off. 
    // - The number of simultaneous contacts exceeded the number supported by the device. 
    private void Grid_PointerCanceled(object sender, PointerRoutedEventArgs e) 
    { 
     Windows.UI.Input.PointerPoint pt = e.GetCurrentPoint(mGrid); 

     if (contacts.ContainsKey(pt.PointerId)) 
     { 
      checkSwipe(); 
      contacts[pt.PointerId] = null; 
      contacts.Remove(pt.PointerId); 
      startLocation.Remove(pt.PointerId); 
      if (pointSwiped.ContainsKey(pt.PointerId)) 
       pointSwiped.Remove(pt.PointerId); 

      --numActiveContacts; 
     } 

     e.Handled = true; 
    } 


    private void Grid_PointerExited(object sender, PointerRoutedEventArgs e) 
    { 
     Windows.UI.Input.PointerPoint pt = e.GetCurrentPoint(mGrid); 

     if (contacts.ContainsKey(pt.PointerId)) 
     { 
      checkSwipe(); 
      contacts[pt.PointerId] = null; 
      contacts.Remove(pt.PointerId); 
      startLocation.Remove(pt.PointerId); 
      if (pointSwiped.ContainsKey(pt.PointerId)) 
       pointSwiped.Remove(pt.PointerId); 

      --numActiveContacts; 
     } 
     e.Handled = true; 
    } 



    void Grid_PointerReleased(object sender, PointerRoutedEventArgs e) 
    { 
     Windows.UI.Input.PointerPoint pt = e.GetCurrentPoint(mGrid); 

     if (contacts.ContainsKey(pt.PointerId)) 
     { 
      checkSwipe(); 
      contacts[pt.PointerId] = null; 
      contacts.Remove(pt.PointerId); 
      startLocation.Remove(pt.PointerId); 
      if (pointSwiped.ContainsKey(pt.PointerId)) 
       pointSwiped.Remove(pt.PointerId); 

      --numActiveContacts; 
     } 
     e.Handled = true; 
    } 


    private void Grid_PointerMoved(object sender, PointerRoutedEventArgs e) 
    { 
     Windows.UI.Input.PointerPoint currentPoint = e.GetCurrentPoint(mGrid); 
     if (currentPoint.IsInContact) 
     { 
      if (startLocation.ContainsKey(currentPoint.PointerId)) 
      { 
       Point startPoint = startLocation[currentPoint.PointerId]; 

       // Compare startPoint to current location and determine if that point did a swipe? 

       double horizontalMovement = currentPoint.Position.X - startPoint.X; 
       double verticalMovement = currentPoint.Position.Y - startPoint.Y; 

       double horizontalDistance = Math.Abs(horizontalMovement); 
       double verticalDistance = Math.Abs(verticalMovement); 

       double requiredLeftMovement = mGrid.ActualWidth * SWIPE_THRESHOLD * -1; 
       double requiredRightMovement = mGrid.ActualWidth * SWIPE_THRESHOLD; 

       double requiredUpMovement = mGrid.ActualHeight * SWIPE_THRESHOLD * -1; 
       double requiredDownMovement = mGrid.ActualHeight * SWIPE_THRESHOLD; 

       if (verticalMovement < requiredUpMovement && horizontalDistance < 100) 
       { 
        pointSwiped[currentPoint.PointerId] = DirectionSwiped.Up; 
       } 
       else if (verticalMovement > requiredDownMovement && horizontalDistance < ALLOWED_DRIFT) 
       { 
        pointSwiped[currentPoint.PointerId] = DirectionSwiped.Down; 
       } 
       else if (horizontalMovement > requiredRightMovement && verticalDistance < ALLOWED_DRIFT) 
       { 
        pointSwiped[currentPoint.PointerId] = DirectionSwiped.Right; 
       } 
       else if (horizontalMovement < requiredLeftMovement && verticalDistance < ALLOWED_DRIFT) 
       { 
        pointSwiped[currentPoint.PointerId] = DirectionSwiped.Left; 
       } 
      } 
     } 
    } 





    void checkSwipe() 
    { 
     NotififyListenerIfSwiped(DirectionSwiped.Up); 
     NotififyListenerIfSwiped(DirectionSwiped.Down); 
     NotififyListenerIfSwiped(DirectionSwiped.Left); 
     NotififyListenerIfSwiped(DirectionSwiped.Right); 
    } 


    private void NotififyListenerIfSwiped(DirectionSwiped direction) 
    { 
     int fingers = numberOfSwipedFingers(direction); 
     if (fingers >= 1) 
     { 
      if (SwipeDetected != null) 
      { 
       SwipeDetected(this, new SwipeEventArgs() { Direction = direction, NumberOfTouches = fingers }); 
      } 
     } 

     if (fingers > 0) 
      pointSwiped.Clear(); 
    } 


    int numberOfSwipedFingers(DirectionSwiped direction) 
    { 
     int count = 0; 
     foreach (var item in pointSwiped) 
     { 
      DirectionSwiped swipe = item.Value; 
      if (swipe == direction) 
      { 
       count += 1; 
      } 
     } 
     return count; 
    } 


} 

Cách sử dụng

public void Gesture_Detected(Object sender, SwipeEventArgs e) 
    { 
     Debug.WriteLine("Number of touches: " + e.NumberOfTouches + " Direction: " + e.Direction); 
    } 


    public MainPage() 
    { 
     this.InitializeComponent(); 

     SwipeGestureDetector gestureDetector = new SwipeGestureDetector(this.rootGrid); 
     gestureDetector.SwipeDetected += Gesture_Detected; 
Các vấn đề liên quan