2010-11-13 1 views
5

Для моего приложения я хотел бы использовать все встроенные возможности манипуляции, например, масштабирования. Но если пользователь нажимает 3 пальца на экран, я хотел бы показать определенный элемент пользовательского интерфейса. Итак, что является лучшим способом проверить, нажал ли пользователь 3 пальца одновременно и рядом друг с другом на экране? (без отключения встроенных возможностей манипуляции).Как проверить, установлены ли 3 пальца на экране

Мой первый подход состоял в регистрации события TouchDown в верхнем элементе Grid моего макета. В обработчике событий я получаю контакт. Но что там делать?

Просто проверьте, является ли контакт отпечатком пальца, сохраните его в списке и проверьте, содержит ли список уже два аналогичных контакта?

Или есть более сексуальное решение?

Спасибо!

Edit:

После ответа я написал два метода:

private void OnContactDown(object sender, ContactEventArgs e) 
     { 
      if (this.ContactsOver.Count == 3) 
      { 
       Console.WriteLine("3 contacts down. Check proximity"); 

       if (areNear(this.ContactsOver)) 
       { 
        Console.WriteLine("3 fingers down!"); 
       } 
      } 
     } 

     private Boolean areNear(ReadOnlyContactCollection contacts) 
     { 
      if (Math.Abs(contacts.ElementAt(0).GetCenterPosition(this).X - contacts.ElementAt(1).GetCenterPosition(this).X) < 100 && 
       Math.Abs(contacts.ElementAt(0).GetCenterPosition(this).Y - contacts.ElementAt(1).GetCenterPosition(this).Y) < 100 && 
       Math.Abs(contacts.ElementAt(1).GetCenterPosition(this).X - contacts.ElementAt(2).GetCenterPosition(this).X) < 100 && 
       Math.Abs(contacts.ElementAt(1).GetCenterPosition(this).Y - contacts.ElementAt(2).GetCenterPosition(this).Y) < 100 && 
       Math.Abs(contacts.ElementAt(0).GetCenterPosition(this).X - contacts.ElementAt(2).GetCenterPosition(this).X) < 100 && 
       Math.Abs(contacts.ElementAt(0).GetCenterPosition(this).Y - contacts.ElementAt(2).GetCenterPosition(this).Y) < 100) 
      { 
       return true; 
      } 
      else 
      { 
       return false; 
      } 
     } 

Они должны быть переписаны, но это работает. И порог (atm 100) должен быть скорректирован.

+1

Будьте осторожны при хранении 'contact' s в вашем собственном списке. Любые вызовы в поле «контакт» или использование полей генерируют исключение, если палец, который вызвал «контакт», больше не работает. – Donnie

ответ

2

Существует свойство на всех поверхностных элементах управления, которое содержит количество контактов. Правило - это ContactOver или любой его вариант в зависимости от вашей потребности, см. http://msdn.microsoft.com/en-us/library/microsoft.surface.presentation.controls.surfacecontrol_properties(v=Surface.10).aspx

Вы можете проверить это значение County County в обработчике событий ContactDown. Чтобы проверить их расстояние, просто сделайте GetPosition на них и используйте базовую векторную математику в точках.

+0

Спасибо, это кажется очень полезным. Я пытаюсь это сегодня вечером и сообщит результат. – RoflcoptrException

+0

Я написал методы для проверки вашего решения: см. Редактирование – RoflcoptrException

 Смежные вопросы

  • Нет связанных вопросов^_^