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

时间:2014-10-17 07:16:47

标签: .net xaml windows-phone-8 windows-phone

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

在Windows Phone 8.1中,ScrollViewer控件将处理manipDelta及相关事件,并且不会触发ManipulationDelta事件。

经过一番搜索,有人提到UseOptimizedManipulationRouting将启用scrollviewer引发事件。但是windows phone 8.1运行时刚删除了这个属性。 Change ManipulationMode可以帮助接收ManipulationDelta事件,但它会禁用ScrollViewer本身的原始滚动行为。

我可以理解ScrollViewer需要中断ManipulationDelta事件以提高性能。我的问题是,在使用滚动查看器时,是否有任何我们或替代方法可以帮助获得手势?

1 个答案:

答案 0 :(得分:1)

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

如您所知,ScrollViewer的子项可以获取操作事件,但ScrollViewer不会这样做。如果孩子们没有占据大部分区域,那么一个有用的模式是允许对孩子进行操作并在孩子外面滚动。如果可操作的子代接管ScrollViewer的全部内容,则无效。

孩子可以尝试调用ScrollViewer.ChangeView()让ScrollViewer与翻译增量一起滚动,但这可能会在你的控件和ScrollViewer之间的边缘变得笨拙。您可以通过接管所有滚动来避免边缘。如果我理解你正在尝试做什么,这可能就是我开始的地方:接管所有内容并根据需要调用ChangeView。

您可以使用CancelDirectManipulations取消ScrollViewer的操作,但不是相反。

困难的部分是确定谁应该处理给定的姿势。如果您使用GestureRecognizer而不是Xaml操作事件,那么您可以决定应该处理手势的PointerPressed,并让它传递给ScrollViewer或关闭ScrollViewer。如果您需要等待PointerMoved识别手势,那就太晚了。

我在{8}的Windows 8中讨论过Windows Store应用程序。现在有一些细节不同,但对于使用Xaml的Windows 8.1和Windows Phone 8.1运行时应用程序,一般的想法是相同的。