【发布时间】:2019-09-06 10:36:10
【问题描述】:
我正在尝试为GridView 的多选实现两指滑动手势。但我无法接收所需的指针事件来计算触摸屏幕的手指数量。我正在开发期间使用 Dell P2314T 进行测试。
指针事件触发的顺序:
理论:PointerPressed(按)=>PointerMoved(刷)=>PointerReleased(已发布)
实际:PointerPressed & PointerCaptureLost(按下但未释放时)
PS:demo 已移除。
这是我的代码的 sn-p,这显然不起作用,因为 PointerMoved 和 PointerReleased 不会触发:
class CustomGridView : GridView
{
List<uint> pointerPoint = new List<uint>();
protected override void PrepareContainerForItemOverride(DependencyObject element, object item)
{
(element as GridViewItem).AddHandler(PointerPressedEvent, new PointerEventHandler(OnPointerPressed), true);
(element as GridViewItem).PointerMoved += OnPointerMoved;
(element as GridViewItem).PointerReleased += OnPointerReleased;
base.PrepareContainerForItemOverride(element, item);
}
private void OnPointerPressed(object sender, PointerRoutedEventArgs e)
{
if (!pointerPoint.Contains(e.Pointer.PointerId))
{
Debug.WriteLine("add:" + e.Pointer.PointerId);
pointerPoint.Add(e.Pointer.PointerId);
}
}
private void OnPointerMoved(object sender, PointerRoutedEventArgs e)
{
if (pointerPoint.Count == 2)
{
Debug.WriteLine("two finger");
}
}
private void OnPointerReleased(object sender, PointerRoutedEventArgs e)
{
if (pointerPoint.Contains(e.Pointer.PointerId))
{
Debug.WriteLine("rem:" + e.Pointer.PointerId);
pointerPoint.Remove(e.Pointer.PointerId);
}
}
}
【问题讨论】:
-
我试过上面的代码,效果很好,能分享一下你用什么设备测试过吗?
-
我正在使用戴尔 P2314T 触摸显示器进行测试。我在发布后以最少的自定义在 GridView 上进行测试,结果相同。
-
我用 Grid 运行你的代码,它可以工作。能否为我们分享一个演示项目?
-
附上演示项目。您可以看到一个 GridView 和一个图像,它们都附加了相同的事件。当点击图像时事件正确触发,但不是 GridView。
-
好的,我会检查你的代码项目。