.net 如何在Scrollviewer控件中启用手势检测?

.net 如何在Scrollviewer控件中启用手势检测?,.net,xaml,windows-phone-8,windows-phone,.net,Xaml,Windows Phone 8,Windows Phone,我在WindowsPhone8.1中创建了一个页面,其中包含许多组件(不仅仅是一个长列表,还有一些其他控件),因此我使用scrollviewer控件包装这些控件。同时,我需要在页面中支持一些手势,比如快速向上/向下滑动 在windows phone 8.1中,ScrollViewer控件将处理操纵增量和相关事件,而不会触发操纵增量事件 经过一些搜索后,有人提到UseOptimizedManipulationRouting将启用scrollviewer引发事件。但是windows phone 8.

我在WindowsPhone8.1中创建了一个页面,其中包含许多组件(不仅仅是一个长列表,还有一些其他控件),因此我使用scrollviewer控件包装这些控件。同时,我需要在页面中支持一些手势,比如快速向上/向下滑动

在windows phone 8.1中,ScrollViewer控件将处理操纵增量和相关事件,而不会触发操纵增量事件

经过一些搜索后,有人提到UseOptimizedManipulationRouting将启用scrollviewer引发事件。但是windows phone 8.1运行时刚刚删除了此属性。更改操纵模式可能有助于接收操纵增量事件,但它将禁用ScrollViewer本身的原始滚动行为


我可以理解ScrollViewer需要中断OperationDelta事件以提高性能。我的问题是,在使用scroll viewer时,我们或其他方法是否有助于获得手势?

无法让scroll viewer和控件同时处理手势。ScrollViewer使用并行系统运行以处理其操作

正如您所注意到的,ScrollViewer的子级可以获得操纵事件,但是ScrollViewer不会这样做。如果子对象不占用大部分区域,那么一个有用的模式是允许对子对象进行操作并在其外部滚动。如果可操纵的子对象接管了ScrollViewer的全部内容,那么这将不起作用

孩子可以尝试调用ScrollViewer.ChangeView()使ScrollViewer与翻译增量一起滚动,但最终可能会在控件和ScrollViewer之间的边缘变得笨拙。您可以通过接管所有滚动来避免边缘。如果我理解您正试图正确执行的操作,这可能就是我的出发点:接管一切并根据需要调用ChangeView

您可以使用CancelDirectOperations取消ScrollViewer的操作,但不能使用相反的方法

困难的部分是决定谁应该处理给定的手势。如果使用手势识别器而不是Xaml操纵事件,则可以决定应处理手势的PointerPressed,并让其传递到ScrollViewer或关闭ScrollViewer。如果你需要等待指针移动来识别手势,那就太晚了


我在上讨论了Windows 8中的Windows应用商店应用程序。现在,一些细节有所不同,但对于使用Xaml的Windows 8.1和Windows Phone 8.1运行时应用程序,总体思路是相同的。

您可能必须创建一个自定义ScrollViewer,它将覆盖OnManipulationDelta。@NateDiamond这里的问题是ScrollViewer类在Windows Phone 8.1中标记为密封。