Как обрабатывать жесты в Windows Phone 7

Жесты являются одним из ключевых способов взаимодействия пользователя и приложения в Windows Phone 7. Это стало возможным благодаря наличию мультитач экранов с 4 касаниями (как минимум) во всех аппаратах на Windows Phone 7. Стандартные элементы управления уже содержат обработчики жестов. Однако, иногда необходимо добавить собственную логику для обработки жестов. В этой заметке будет рассказано о том, как добавить свою логику обработки жестов за несколько шагов.

Список всех доступных жестов подробно описан в соответствующем разделе MSDN, вот только некоторые, наиболее популярные из них:

Нажатие (Tap)
Нажатие (Tap)
Двойное нажатие (Double Tap)
Двойное нажатие (Double Tap)
Нажатие и удержание (Touch and Hold)
Нажатие и удержание (Touch and Hold)

Для обработки манипуляций каждый элемент управления имеет три события:

  • ManipulationStarted – генерируется при начале выполнения какого-либо жеста;
  • ManipulationDelta – генерируется периодически в процессе выполнения жеста (позволяет отследить относительное смещение);
  • ManipulationCompleted – генерируется в момент завершения жеста (пользователь оторвал пальцы от экрана).

Можно построить несложную математическую модель для отслеживания жестов на основе этих событий. Однако, более простой способ обрабатывать жесты — использовать объект GestureService из Windows Phone 7 Toolkit. Этот объект отслеживает стандартные жесты и позволяет подписаться на соответствующие события.

Для использования GestureService следует добавить ссылку на сборку Microsoft.Phone.Controls.Toolkit.dll, в которой и находится нужный объект. После этого следует добавить соответствующее пространство имен в определение страницы:

xmlns:toolkit="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone.Controls.Toolkit"

Теперь можно добавить обработку жестов для элементов управления. Например, создадим элемент Rectangle и добавим обработку жеста Hold:

<Rectangle Fill="Green">
  <toolkit:GestureService.GestureListener>
    <toolkit:GestureListener Hold="OnHoldHandler" />
  </toolkit:GestureService.GestureListener>
</Rectangle>

В коде страницы должен быть обработчик с именем OnHoldHandler:

private void GestureListener_Hold(object sender, GestureEventArgs e)
{
  // ...
}

Теперь при обнаружении жеста Hold будет срабатывать заданный обработчик.