触摸输入和直接操作

时间:2015-07-14 13:19:16

标签: c# windows-runtime windows-phone touch swipe

我正在听几个事件来处理Windows(Phone)8.1运行时代码中的触摸输入。只要不涉及ScrollViewer,这种方法就可以正常工作。由于Direct ManipulationScrollViewer会吞下所有手势事件。

以下是我现在收听的事件(viewFrameworkElement):

        var cw = Window.Current.CoreWindow;
        cw.PointerPressed += OnPointerPressed;
        cw.PointerMoved += OnPointerMoved;
        cw.PointerReleased += OnPointerReleased;
        cw.PointerCaptureLost += OnPointerCaptureLost;

        view.Tapped += onTap;
        view.DoubleTapped += onDoubleTap;
        view.Holding += onHold;
        view.ManipulationDelta += onManipulationDelta;
        view.ManipulationCompleted += onManipulationCompleted;

一旦ScrollViewer识别出一个点击,我就会得到一个PointerCaptureLost并且不再调用其他事件处理程序。

Rob Caplan wrote in 2013

  

不幸的是,如果应用程序需要滚动和手势(例如,针对滚动检测CrossSlides),则没有好的解决方案。在这种情况下,到处获取指针消息的唯一选择是在所有地方禁用直接操作,但也禁用滚动。要获得该功能,应用程序将需要检测滚动手势本身,然后使用ScrollToHorizo​​ntalOffset或ScrollToVerticalOffset或通过更新SelectedIndex将ScrollViewer导航到新位置。这很棘手,并且比让ScrollViewer做它的事情要慢得多。如果可能的话应该避免。

在此期间有变化吗?有人知道这样做的样本吗?

我正在编写一个抽象,将手势事件转换为不同的事件。用户可以在其中放置任何控件,我也不知道,他可以用它做什么。所以我不能放慢它只是为了获得手势事件。

ScrollViewer旁边是否还有其他类似行为的控件?

Windows.UI.Input.GestureRecognizer有帮助吗?由于UIElement已经提供了我需要的所有事件,我没有尝试过 - 我不明白为什么要这样做。

1 个答案:

答案 0 :(得分:0)

为什么不在ScrollViewer上方使用一些透明层,然后将事件转发给它(在完成处理之后,或者等待它首先处理它们,但是记住它们之后也要对它们采取行动)?