ListView ManipulationCompleted 事件不适用于 phone

ListView ManipulationCompleted event doesn't work on phone

我在 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 的 phone 上不起作用。处理程序中的代码永远不会被调用。 它在 PC 上运行良好,但在 phone 上不起作用。我不明白为什么。

ListView在PC上工作时,我们可以通过滚动鼠标滚轮来滚动它,但是当它在phone上工作时,没有鼠标设备连接到phone,我们实际上是通过滑动来滚动 ListView

一个 ListView 控件包含一个 ScrollViewer 像这样:

我认为问题出在这个ScrollViewer,在PC上,它分别处理Scrolling和Manipulation事件,但在phone上,它无法区分滚动和操作事件。

在我看来,这个操作事件可以响应鼠标设备,但不能响应单指触摸。如果我们在移动模拟器和模拟器上测试 ListView 会更清楚,当您使用 phone 模拟器的 Single Point Mouse Input 或模拟器的 Mouse Mode 时,操作事件工作正常,但是当你使用手机模拟器的Single Point Touch Input或模拟器的Basic Touch Mode时,它不起作用。有趣的是,当我们使用 Multi-Touch Input 时,操作事件实际上在移动模拟器上仍然可以正常工作。更有趣的是,Using manipulation events的官方文档说:

If you don't have a touch-screen monitor, you can test your manipulation event code in the simulator using a mouse and mouse wheel interface.

所以,它应该在真实的 phone 上工作。由于我现在没有任何设备,我无法判断它在真实 phone 上是否正常工作,我会在设备上测试后更新我的答案。

但是,我们仍然可以通过像这样处理Pointer的事件来在phone上操作ListView

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

已测试,在 PC 和 phone 上都可以正常工作。

更新:

刚在X1 Carbon,Lumia950上测试,发现Manipulation事件会用两根手指触发,结果和手机模拟器一样。