【问题标题】:Two-finger swipe gesture on GridView for UWP touch app用于 UWP 触摸应用的 GridView 上的两指滑动手势
【发布时间】:2019-09-06 10:36:10
【问题描述】:

我正在尝试为GridView 的多选实现两指滑动手势。但我无法接收所需的指针事件来计算触摸屏幕的手指数量。我正在开发期间使用 Dell P2314T 进行测试。

指针事件触发的顺序: 理论:PointerPressed(按)=>PointerMoved(刷)=>PointerReleased(已发布) 实际:PointerPressed & PointerCaptureLost(按下但未释放时)

PS:demo 已移除。

这是我的代码的 sn-p,这显然不起作用,因为 PointerMovedPointerReleased 不会触发:

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。
  • 好的,我会检查你的代码项目。

标签: c# mvvm uwp


【解决方案1】:

这是我的解决方案: 根据观察,ScrollViewer 将捕获剩余的指针事件。 ScrollViewer 应该被禁用,并且在PointerPressed 被触发时应该取消正在进行的直接操作。

XAML:

<GridView ScrollViewer.VerticalScrollMode="{x:Bind GridViewScrollMode}"/>

C#:

private void OnPointerPressed(object sender, PointerRoutedEventArgs e)
{
    pointerPoints.Add(e.Pointer.PointerId);
    if (PointerIds.Count == 2)
    {
        ((sender as GridView).ContainerFromIndex(0) as GridViewItem).CancelDirectManipulations();
        GridViewScrollMode = ScrollMode.Disabled;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-14
    • 2016-01-27
    • 2023-04-07
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    • 2018-05-06
    • 1970-01-01
    相关资源
    最近更新 更多