在 WP8.1 中拦截 ManipulationDelta 的问题
Problems intercepting ManipulationDelta in WP8.1
我刚开始使用 WP8.1 的应用程序,在保留原始事件处理的同时拦截触摸移动事件时遇到问题。
我想做的是:
- 我在
StackPanel
中有一个 ListView
在 Grid
中有一个 ScrollViewer
。 ScrollViewer 处理 StackPanel/ListView. 的垂直滚动
- 每当出现水平触摸移动时,我希望收到通知,以便我可以根据水平移动调整某些 ui 元素的位置。
听起来很简单,但我尝试过的任何方法似乎都取消了 ScrollViewer
的原始触摸移动处理,因此垂直滚动不再起作用。我真的很讨厌自己实现整个滚动行为...
我已经试过了:
- 将
ManipulationMode="TranslationX" ManipulationDelta="handleXTranslation"
放在 ScrollViewer
上。 handelXTranslation
处理程序从未因任何原因被调用。
- 将相同的操作信息放在
ListView
- 现在处理程序被调用(以及 parent ui 元素的所有处理程序),但是 ScrollViewer
不再处理滚动,可能是因为 ListView
不再将事件传播到它的 parent。
- 加载时向 xaml class 添加通用触摸处理程序。同样的问题 - 要么它没有被调用,如果它被调用,
ScrollViewer
的滚动就不再完成了。
XAML 代码如下所示(删除了一些数据):
<Grid x:Name="LayoutRoot" Background="Transparent" ManipulationMode="TranslationX" ManipulationDelta="gridTranslationX">
<ScrollViewer x:Name="ScrollViewer" ManipulationMode="TranslationX" ManipulationDelta="scrollViewerTranslationX">
<StackPanel x:Name="StackPanel" Orientation="Horizontal" ManipulationMode="TranslationX" ManipulationDelta="scrollViewerTranslationX">
<ListView x:Name="ListView" ManipulationMode="TranslationX" ManipulationDelta="scrollViewerTranslationX">
</ListView>
</StackPanel>
</ScrollViewer>
</Grid>
我尝试在代码中安装的处理程序如下所示:
this.AddHandler(UIElement.ManipulationDeltaEvent, new ManipulationDeltaEventHandler(genericDeltaHandler), true);
ListView.PointerMoved += new PointerEventHandler(pointerEvent);
有什么方法可以只观察操纵事件而不影响他们的正常治疗吗?
有时谈论它会有所帮助 ;-) ...
答案确实很简单,只需将 System
值添加到 ListView
:
上的 ManipulationMode
<ListView x:Name="ListView" ManipulationMode="TranslateX,System" ManipulationDelta="translationX">
我刚开始使用 WP8.1 的应用程序,在保留原始事件处理的同时拦截触摸移动事件时遇到问题。
我想做的是:
- 我在
StackPanel
中有一个ListView
在Grid
中有一个ScrollViewer
。 ScrollViewer 处理 StackPanel/ListView. 的垂直滚动
- 每当出现水平触摸移动时,我希望收到通知,以便我可以根据水平移动调整某些 ui 元素的位置。
听起来很简单,但我尝试过的任何方法似乎都取消了 ScrollViewer
的原始触摸移动处理,因此垂直滚动不再起作用。我真的很讨厌自己实现整个滚动行为...
我已经试过了:
- 将
ManipulationMode="TranslationX" ManipulationDelta="handleXTranslation"
放在ScrollViewer
上。handelXTranslation
处理程序从未因任何原因被调用。 - 将相同的操作信息放在
ListView
- 现在处理程序被调用(以及 parent ui 元素的所有处理程序),但是ScrollViewer
不再处理滚动,可能是因为ListView
不再将事件传播到它的 parent。 - 加载时向 xaml class 添加通用触摸处理程序。同样的问题 - 要么它没有被调用,如果它被调用,
ScrollViewer
的滚动就不再完成了。
XAML 代码如下所示(删除了一些数据):
<Grid x:Name="LayoutRoot" Background="Transparent" ManipulationMode="TranslationX" ManipulationDelta="gridTranslationX">
<ScrollViewer x:Name="ScrollViewer" ManipulationMode="TranslationX" ManipulationDelta="scrollViewerTranslationX">
<StackPanel x:Name="StackPanel" Orientation="Horizontal" ManipulationMode="TranslationX" ManipulationDelta="scrollViewerTranslationX">
<ListView x:Name="ListView" ManipulationMode="TranslationX" ManipulationDelta="scrollViewerTranslationX">
</ListView>
</StackPanel>
</ScrollViewer>
</Grid>
我尝试在代码中安装的处理程序如下所示:
this.AddHandler(UIElement.ManipulationDeltaEvent, new ManipulationDeltaEventHandler(genericDeltaHandler), true);
ListView.PointerMoved += new PointerEventHandler(pointerEvent);
有什么方法可以只观察操纵事件而不影响他们的正常治疗吗?
有时谈论它会有所帮助 ;-) ...
答案确实很简单,只需将 System
值添加到 ListView
:
ManipulationMode
<ListView x:Name="ListView" ManipulationMode="TranslateX,System" ManipulationDelta="translationX">