触摸输入和直接操作

本文关键字:操作 输入 触摸 | 更新日期: 2023-09-27 18:02:41

我正在听几个事件来处理我的Windows (Phone) 8.1运行时代码中的触摸输入。只要不涉及ScrollViewer,这就可以很好地工作。ScrollViewer吞噬所有由于直接操作而产生的手势事件。

这是我现在听的事件(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;

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

Rob Caplan在2013年写道:

不幸的是,如果应用程序同时需要滚动和手势(例如,根据滚动检测CrossSlides),则没有好的解决方案。在这种情况下,在任何地方获得指针消息的唯一选择是在任何地方禁用直接操作,但这也禁用了滚动。要得到那个回应用程序将需要检测滚动手势本身,然后导航ScrollViewer到新的位置与ScrollToHorizontalOffset或ScrollToVerticalOffset或通过更新SelectedIndex。这是很棘手的,并且会比让ScrollViewer做它的事情明显慢。如果可能的话,应该尽量避免。

在此期间有改变吗?有人知道这样做的例子吗?

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

是否有任何其他控件的ScrollViewer的行为类似?

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

触摸输入和直接操作

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