我想让用户在包含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事件没有在手机上升起。我该如何解决这个问题?
答案 0 :(得分:1)
一开始我想说,如果Margin
上没有ListView
或Padding
上没有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
这样在Border
和ListView
之间留出一些空格,然后您可以在模拟器上的<ListView Margin="50">
之外捕获此事件,但这样做会打破原有的UI设计。另一种解决方法就像我说的那样,你可以使用ListView
事件。刚刚测试过,当这些事件发生在Pointer
的父级时,他们仍然可以在模拟器上被解雇。