在WP8.1中拦截ManipulationDelta的问题

3
我刚开始使用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 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个回答

2
有时候谈论一下问题会有所帮助;-) ...
答案确实很简单,只需要在ListViewManipulationMode中添加System值即可:
<ListView x:Name="ListView" ManipulationMode="TranslateX,System" ManipulationDelta="translationX">

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接