[英]Horizontal scroll on ListView
我目前正在捕获页面上的PointerMoved
事件,以与水平菜单一起使用。 因此,用户可以向左/向右滑动,页面将相应地进行动画处理。
当用户触摸静态元素(TextBlock等)时有效,但是如果用户触摸ListView,它将捕获触摸事件。
如何实现ListView,以便当用户垂直滚动时它可以正常工作,但是当用户水平滚动时,它将事件传递给我的代码?
可能,但是您将需要一个小技巧。 作为参考,我将罗伯·卡普兰的文章放在这里。
开始吧:
首先-您的活动在哪里? -答案很简单-启用ScrollViewer
,所有事件都会被它拦截并处理。 您ListView
将仅获得PointerEntered
事件,并且在PointerExited
,所有进一步的处理都由ScrollViewer
处理。 那就是问题所在。 但是正如我所说,有一种方法可以做您想要的。
为此,假设您仅使用VerticalScroll定义了ListView
:
<ListView Name="myList" ScrollViewer.HorizontalScrollMode="Disabled">
当然可以对两个方向都做,但这是一个简单的示例。
现在让我们看一下Page
构造函数:
PointerPoint firstPoint = null; ScrollViewer listScrollviewer = null; public MainPage() { this.InitializeComponent(); myList.ItemsSource = yourItemSource; myList.PointerEntered += myList_PointerEntered; myList.PointerMoved += myList_PointerMoved; }
这里没什么奇怪的-我只订阅事件,并声明两个变量firstPoint
和listScrollviewer
,稍后将需要它们。
我们还需要获取ListView
的ScrollViewer
以下方法将完成此工作:
public static ScrollViewer GetScrollViewer(DependencyObject depObj) { if (depObj is ScrollViewer) return depObj as ScrollViewer; for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++) { var child = VisualTreeHelper.GetChild(depObj, i); var result = GetScrollViewer(child); if (result != null) return result; } return null; }
现在-要启用事件,我们将需要禁用ScrollViewer
:
private ScrollViewer DisableScrolling(DependencyObject depObj) { ScrollViewer foundOne = GetScrollViewer(depObj); if (foundOne != null) foundOne.VerticalScrollMode = ScrollMode.Disabled; return foundOne; }
我们将在PointerEntered
事件后禁用ScrollViewer
。 在这一步中,我们还将记住按下的PointerPoint
因为我们已禁用Scrollviewer
,所以我们将不得不手动滚动-这就是我们需要此PointerPoint
的目的。
private void myList_PointerEntered(object sender, PointerRoutedEventArgs e) { firstPoint = e.GetCurrentPoint(myList); if (listScrollviewer == null) listScrollviewer = DisableScrolling(myList); }
最后是我们的PointerMoved
事件,由于禁用了ScrollViewer
,现在将触发该事件-移动ScrollViewer
+您需要放置的其他代码:
private void myList_PointerMoved(object sender, PointerRoutedEventArgs e) { if (listScrollviewer != null) { PointerPoint secondPoint = e.GetCurrentPoint(myList); double verticalDifference = secondPoint.Position.Y - firstPoint.Position.Y; listScrollviewer.ChangeView(null, listScrollviewer.VerticalOffset - verticalDifference, null); } // some other code you need }
几句话:
ListView
或其他控件具有水平滚动,则还需要禁用并处理它, ScrollViewer
一样流畅。 我还在OneDrive上放置了一个简单的工作示例。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.