对ListView的父级进行操作

时间:2016-03-09 16:17:13

标签: xaml listview win-universal-app

我想让用户在包含ListView的控件上滑动。 以下是示例代码:

<Border ManipulationMode="All"
        ManipulationDelta="UIElement_OnManipulationDelta">
    <ListView>
        <ListView.Items>
            <x:Int32>1</x:Int32>
            <x:Int32>1</x:Int32>
            <x:Int32>1</x:Int32>
            <x:Int32>1</x:Int32>
            <x:Int32>1</x:Int32>
            <x:Int32>1</x:Int32>
            <x:Int32>1</x:Int32>
        </ListView.Items>
        <ListView.ItemTemplate>
            <DataTemplate>
                <Grid Width="200" Height="50"/>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>
</Border>

由于某种原因,ManipulationDelta事件没有在手机上升起。我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

一开始我想说,如果Margin上没有ListViewPadding上没有Border,则没有这样的大小限制在这两个元素上,此方案中的ListView将填充整个边框并默认首先捕获所有事件。

但是UIElement.ManipulationDelta event是一个路由事件。当你轻扫它时,ListView会抓住它,同时你没有在ListView上处理这个事件,所以这个事件会冒泡到父元素,因为它未处理,然后你的{ {1}}作为父级elemtn可以处理此事件。这就是为什么ListView的父级操作可以在PC上被激活的原因。

但是为什么它会在移动模拟器上被解雇?正如我所说,此滑动手势首先由Border捕获,而ListView控件中包含ListView,此ScrollViewer将在移动设备上滚动时处理您的滑动手势模拟器,然后赢得ScrollViewer再次将此事件传递给其父级,就像在PC上一样。

PC和模拟器上此事件的区别在于,操作事件可以响应鼠标设备,但不能单手触摸。您可以参考ListView ManipulationCompleted event doesn't work on phone

如何解决这个问题?一个非常简单的方法是,您可以像ListView这样在BorderListView之间留出一些空格,然后您可以在模拟器上的<ListView Margin="50">之外捕获此事件,但这样做会打破原有的UI设计。另一种解决方法就像我说的那样,你可以使用ListView事件。刚刚测试过,当这些事件发生在Pointer的父级时,他们仍然可以在模拟器上被解雇。