Стратегия отличия TouchUp от TouchLeave и TouchDown от TouchEnter?

Для базового сценария, описанного в обзоре msdn (в разделе Touch and Manipulation) TouchEnter и TouchLeave запускаются для каждого соответствующего TouchDown и TouchUp соответственно. В отличие от мыши, сенсорный экран и стилус не ограничены в поддержании контакта с экраном.

Есть ли способ использовать TouchEnter и TouchLeave для захвата, только когда палец перетаскивается в UIElement. Поскольку эти события запускаются для каждого TouchUp и TouchDown, как лучше всего различать эти события?

Одна стратегия, которая будет работать для случая с одним пальцем, - установить флаг на TouchDown и проверить, установлен ли флаг на TouchUp. Это позволяет выполнять некоторые проверки условий в TouchUp. Однако для нескольких пальцев это невозможно.

События PreviewTouchEnter и PreviewTouchLeave не запускаются, только PreviewTouchDown и PreviewTouchUp. Последовательность событий для пальца, опущенного на UIElement, а затем поднятого над ним, выглядит следующим образом:

  1. TouchEnter
  2. PreviewTouchDown
  3. TouchDown
  4. Предварительный просмотр
  5. TouchUp
  6. TouchLeave

Эта последовательность не помогает отличить TouchEnter, который произошел из-за перетаскивания пальца по экрану в UIElement, от пальца, опущенного непосредственно на UIElement. Я что-то упускаю или сам фреймворк не поддерживает такую ​​дифференциацию?


person Sashi    schedule 15.01.2012    source источник


Ответы (2)


Можете ли вы использовать TouchDevice Класс, чтобы отслеживать, где создаются касания. Новым прикосновениям присваивается новый идентификатор, чтобы вы могли различать существующие прикосновения и новые, а также то, какие элементы захватывают устройство. Я предполагаю, что это позволяет обойти события манипуляции и обычные процессы, но я надеюсь, что это поможет.

person aleatoric    schedule 17.04.2013

Если вы извлекаете TouchPoint для события, на нем есть свойство с именем Action, которое сообщает вам, является ли это событием Down, Move или Up.

void m_element_TouchEnter(object sender, System.Windows.Input.TouchEventArgs e)
{
    var touchPoint = e.GetTouchPoint(m_someElement);

    if (touchPoint.Action == System.Windows.Input.TouchAction.Move)
    {
        //This is a "true" TouchEnter event
    }
    else if (touchPoint.Action == System.Windows.Input.TouchAction.Down)
    {
        //This is a "true" TouchDown event.
    }
}
person TMVector    schedule 25.04.2014