ListView ManipulationCompleted事件在手机上无法工作

11

我在一个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);
    };
};

在手机上 ListView 中,ManipulationCompleted 事件无法正常工作。处理程序中的代码从未被调用。 在 PC 上可以正常工作,但在手机上无法正常工作。我不明白为什么。


预期的行为是什么?手机上出了什么问题? - kennyzx
ListView中的manipulationcompleted事件在手机上不起作用。处理程序内的代码永远不会被调用。 - SYL
好的,请将此更新到您的问题中。 - kennyzx
1个回答

6
ListView 在电脑上工作时,我们可以通过滚动鼠标滚轮来滚动它,但是当它在手机上工作时,手机没有连接鼠标设备,我们实际上是通过滑动来滚动 ListViewListView 控件包含一个像这样的 ScrollViewerenter image description here 我认为问题出在这个 ScrollViewer 上,当它在电脑上时,它会分别处理滚动和操作事件,但是当它在手机上时,它无法区分滚动和操作事件。
在我看来,这个操作事件可以响应鼠标设备,但不能响应单指触摸。如果我们在移动模拟器上测试 ListView,使用手机模拟器的 Single Point Mouse Input 或模拟器的 Mouse Mode 时,操作事件能正常工作,但是如果使用移动模拟器的 Single Point Touch Input 或模拟器的 Basic Touch Mode 时,它就无法工作。有趣的是,在移动模拟器上使用 Multi-Touch Input 时,操作事件实际上仍然能够正常工作。更有趣的是,官方文档 Using manipulation events 中写道:

如果您没有触摸屏幕监视器,可以使用鼠标和鼠标滚轮接口在模拟器中测试操作事件代码。

因此,它应该在真实的手机上正常工作。由于我现在没有任何设备,我无法确定它是否在真实的手机上正常工作,等我测试过后会更新我的答案。
但是,我们仍然可以通过处理 Pointer 事件来在手机上操作 ListView,如下所示:
<ListView x:Name="MyListView" PointerCanceled="PointerExisted" PointerEntered="PointerEntered" PointerMoved="PointerMoved" PointerExited="PointerExisted">

我已经测试过了,它在电脑和手机上都能正常工作。

更新:

我刚刚在X1 Carbon和Lumia950上进行了测试,我发现Manipulation事件将使用两个手指触发,结果与在移动模拟器上的结果相同。


你测试过使用触摸时的 PointerMovedPointerExited 事件了吗?我认为它们根本不会被触发。 - Justin XL
已尝试您的方法,但在模拟器上使用“基本触摸模式”和在模拟器上时,“指针”事件不会触发。 - Ku6opr
@Ku6opr,除了PointerCanceled事件之外,它们在模拟器和仿真器上都能正常工作。我还测试了PointerPressedPointReleased事件,它们也可以被触发。我的模拟器版本是10586。你在测试这些事件之前有聚焦于ListView吗?我开始怀疑自己可能以错误的方式测试了PointerCanceled事件... - Grace Feng
好的解决方案。我已通过在屏幕左侧使用细栅格列并处理其上的manipulationcompleted事件来解决我的任务。 - SYL
在垂直列表上水平排列 - Ku6opr
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接