【问题标题】:How to enable gesture detect in Scrollviewer control?如何在 Scrollviewer 控件中启用手势检测?
【发布时间】:2014-10-17 07:16:47
【问题描述】:

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

在windows phone 8.1 中,ScrollViewer 控件将处理manipulationDelta 和相关事件,并且不会触发ManipulationDelta 事件。

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

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

【问题讨论】:

  • 您可能需要创建一个自定义 ScrollViewer 来覆盖 OnManipulationDelta。
  • @NateDiamond 这里的问题是 ScrollViewer 类在 Windows Phone 8.1 中被标记为密封。

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


【解决方案1】:

没有办法让 ScrollViewer 和您的控件同时处理手势。 ScrollViewer 与并行系统一起运行以处理其操作。

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

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

您可以使用 CancelDirectManipulations 取消 ScrollViewer 的操作,但反之则不行。

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

我在http://blogs.msdn.com/b/wsdevsol/archive/2013/02/16/where-did-all-my-gestures-go.aspx 讨论了有关 Windows 8 中的 Windows 应用商店应用程序的问题。一些细节现在有所不同,但总体思路对于带有 Xaml 的 Windows 8.1 和 Windows Phone 8.1 运行时应用程序是相同的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-15
    • 1970-01-01
    • 1970-01-01
    • 2019-12-21
    • 1970-01-01
    • 1970-01-01
    • 2013-08-13
    相关资源
    最近更新 更多