Событие ListView ManipulationCompleted не работает на телефоне

У меня есть этот код в приложении Windows 10 UWP:

MyListView.ManipulationMode = ManipulationModes.TranslateX;
MyListView.ManipulationStarted += (s, e) => x1 = (int)e.Position.X;
MyListView.ManipulationCompleted += (s, e) =>
{
    x2 = (int)e.Position.X;
    if (x1 > x2)
    {
        DataController.PaneOpen(false);
    };
    if (x1 < x2)
    {
        DataController.PaneOpen(true);
    };
};

Событие ManipulationCompleted не работает на телефоне в ListView. Код внутри обработчика никогда не вызван. Он отлично работает на ПК, но не работает на телефоне. Я не понимаю, почему.

Ответ 1

Когда a ListView работает на ПК, мы можем прокручивать его, прокручивая колесо мыши, но когда он работает на телефоне, к телефону не подключено устройство мыши, мы на самом деле прокручиваем ListView путем прокрутки.

A ListView содержит ScrollViewer: введите описание изображения здесь

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

На мой взгляд, это событие манипуляции может реагировать на устройство Mouse, но не на одно касание пальца. Яснее, если мы протестируем ListView на мобильном эмуляторе и симуляторе, когда вы используете Single Point Mouse Input эмулятора телефона или Mouse Mode симулятора, события манипуляции работают нормально, но когда вы используете Single Point Touch Input мобильного эмулятора или Basic Touch Mode симулятора, он не работает. Интересно, что события манипуляции на самом деле все еще отлично работают на мобильном эмуляторе, когда мы используем Multi-Touch Input. Более интересно то, что официальные документы Использование событий манипуляции говорят:

Если у вас нет сенсорного экрана, вы можете протестировать свой код события манипуляции в симуляторе с помощью интерфейса мыши и мыши.

Итак, он должен работать на реальном телефоне. Поскольку у меня пока нет устройства, я не могу сказать, хорошо ли он работает на реальном телефоне, я обновлю свой ответ после проверки его на устройстве.

Но, мы все еще можем манипулировать ListView на телефоне, обрабатывая события Pointer следующим образом:

<ListView x:Name="MyListView" PointerCanceled="PointerExisted" PointerEntered="PointerEntered" PointerMoved="PointerMoved" PointerExited="PointerExisted">

Протестировано, оно отлично работает как на ПК, так и на телефоне.

Update:

Только что протестированный на X1 Carbon, Lumia950, я обнаружил, что событие Manipulation будет запущено двумя пальцами, результат будет таким же, как на мобильном эмуляторе.