繁体   English   中英

在ListView上水平滚动

[英]Horizontal scroll on ListView

我目前正在捕获页面上的PointerMoved事件,以与水平菜单一起使用。 因此,用户可以向左/向右滑动,页面将相应地进行动画处理。

当用户触摸静态元素(TextBlock等)时有效,但是如果用户触摸ListView,它将捕获触摸事件。

如何实现ListView,以便当用户垂直滚动时它可以正常工作,但是当用户水平滚动时,它将事件传递给我的代码?

可能,但是您将需要一个小技巧。 作为参考,我将罗伯·卡普兰的文章放在这里。

开始吧:

  1. 首先-您的活动在哪里? -答案很简单-启用ScrollViewer ,所有事件都会被它拦截并处理。 ListView将仅获得PointerEntered事件,并且在PointerExited ,所有进一步的处理都由ScrollViewer处理。 那就是问题所在。 但是正如我所说,有一种方法可以做您想要的。

  2. 为此,假设您仅使用VerticalScroll定义了ListView

     <ListView Name="myList" ScrollViewer.HorizontalScrollMode="Disabled"> 

    当然可以对两个方向都做,但这是一个简单的示例。

  3. 现在让我们看一下Page构造函数:

     PointerPoint firstPoint = null; ScrollViewer listScrollviewer = null; public MainPage() { this.InitializeComponent(); myList.ItemsSource = yourItemSource; myList.PointerEntered += myList_PointerEntered; myList.PointerMoved += myList_PointerMoved; } 

    这里没什么奇怪的-我只订阅事件,并声明两个变量firstPointlistScrollviewer ,稍后将需要它们。

  4. 我们还需要获取ListViewScrollViewer以下方法将完成此工作:

     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; } 
  5. 现在-要启用事件,我们将需要禁用ScrollViewer

     private ScrollViewer DisableScrolling(DependencyObject depObj) { ScrollViewer foundOne = GetScrollViewer(depObj); if (foundOne != null) foundOne.VerticalScrollMode = ScrollMode.Disabled; return foundOne; } 
  6. 我们将在PointerEntered事件后禁用ScrollViewer 在这一步中,我们还将记住按下的PointerPoint因为我们已禁用Scrollviewer ,所以我们将不得不手动滚动-这就是我们需要此PointerPoint的目的。

     private void myList_PointerEntered(object sender, PointerRoutedEventArgs e) { firstPoint = e.GetCurrentPoint(myList); if (listScrollviewer == null) listScrollviewer = DisableScrolling(myList); } 
  7. 最后是我们的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM