在WP8.1中拦截ManipulationDelta的问题

时间:2015-01-28 14:30:17

标签: c# wpf touch windows-phone-8.1 manipulationdelta

我刚开始使用WP8.1的应用程序,遇到拦截触摸移动事件的问题,同时保留原始事件处理。

我想做的是以下内容:

  • ListView中的StackPanel ScrollViewerGrid ScrollViewer。 ScrollViewer处理StackPanel / ListView的垂直滚动。
  • 每当出现水平触摸移动时,我都希望收到通知,以便根据水平移动调整ui元素的位置。

听起来很简单,但我试过的任何方式似乎取消ManipulationMode="TranslationX" ManipulationDelta="handleXTranslation"的原始触摸移动处理,因此垂直滚动不再起作用。我真的很讨厌自己实现整个滚动行为......

我已经尝试过了:

  • ScrollViewer上放置handelXTranslation。无论出于何种原因,都不会调用ListView处理程序。
  • ScrollViewer上放置相同的操作信息 - 现在处理程序被调用(以及父ui元素的所有处理程序),但ListView不再处理滚动,可能是因为{ {1}}不再将该事件传播给其父母。
  • 在加载xaml类时向其添加常规触摸处理程序。同样的问题 - 要么没有被调用,要么被调用,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);

有没有办法在不干扰正常治疗的情况下观察操纵事件?

1 个答案:

答案 0 :(得分:2)

有时谈论它会有所帮助;-) ......

答案确实就像将{strong> System 值添加到ManipulationMode上的ListView一样简单:

<ListView x:Name="ListView" ManipulationMode="TranslateX,System" ManipulationDelta="translationX">