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事件会用两根手指触发,结果和手机模拟器一样。
我在 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事件会用两根手指触发,结果和手机模拟器一样。