触摸输入和直接操作

Mic*_*ler 5 c# touch swipe windows-phone windows-runtime

我正在听几个事件来处理我的 Windows (Phone) 8.1 运行时代码中的触摸输入。只要不ScrollViewer涉及,这就能很好地工作。ScrollViewer由于Direct Manipulation,吞下所有手势事件。

以下是我现在听的事件(view是一个FrameworkElement):

        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;
Run Code Online (Sandbox Code Playgroud)

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

Rob Caplan 在 2013 年写道

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

这期间有没有改变?有人知道这样做的样本吗?

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

除了ScrollViewer行为类似的控件之外,还有其他控件吗?

可以Windows.UI.Input.GestureRecognizer帮忙吗?由于UIElement已经提供了我需要的所有事件,我没有尝试 - 而且我不明白为什么有人应该这样做。

Geo*_*lis -1

为什么不在 ScrollViewer 之上使用一些透明层,然后将事件转发给它(要么在第一次完成处理之后,要么等待它先处理它们,但也要记住之后要对哪些事件进行操作)?