我刚开始使用WP8.1的应用程序,在拦截触摸移动事件并保留原始事件处理的同时遇到了问题。我的目标是:
- 在一个Grid中有一个ScrollViewer,其中包含一个StackPanel和ListView,并且ScrollViewer负责StackPanel/ListView的垂直滚动。 - 当出现水平触摸移动时,我想得到通知,以便根据水平移动调整某些UI元素的位置。
听起来很简单,但是我尝试的所有方法似乎都会取消ScrollViewer的原始触摸移动处理,因此垂直滚动将不再起作用。我真的不想自己实现整个滚动行为……
我已经尝试过以下方法:
- 在ScrollViewer上放置ManipulationMode="TranslationX" ManipulationDelta="handleXTranslation"。由于某种原因,handelXTranslation处理程序从未被调用。 - 在ListView上放置相同的操纵信息-Manipulation,现在可以调用处理程序(以及父UI元素的所有处理程序),但是ScrollViewer不再处理滚动,可能是因为ListView不再将事件传播到其父级。 - 在xaml类加载时添加一般触摸处理程序。相同的问题-如果没有被调用,如果被调用,则不再执行ScrollViewer的滚动。
XAML代码如下(去除一些数据):
有没有办法只“观察”操作事件而不干扰它们的正常处理?
- 在一个Grid中有一个ScrollViewer,其中包含一个StackPanel和ListView,并且ScrollViewer负责StackPanel/ListView的垂直滚动。 - 当出现水平触摸移动时,我想得到通知,以便根据水平移动调整某些UI元素的位置。
听起来很简单,但是我尝试的所有方法似乎都会取消ScrollViewer的原始触摸移动处理,因此垂直滚动将不再起作用。我真的不想自己实现整个滚动行为……
我已经尝试过以下方法:
- 在ScrollViewer上放置ManipulationMode="TranslationX" ManipulationDelta="handleXTranslation"。由于某种原因,handelXTranslation处理程序从未被调用。 - 在ListView上放置相同的操纵信息-Manipulation,现在可以调用处理程序(以及父UI元素的所有处理程序),但是ScrollViewer不再处理滚动,可能是因为ListView不再将事件传播到其父级。 - 在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);
有没有办法只“观察”操作事件而不干扰它们的正常处理?