gpt4 book ai didi

c# - ListView 上的水平滚动

转载 作者:行者123 更新时间:2023-12-01 16:26:38 24 4
gpt4 key购买 nike

我当前正在捕获页面上的 PointerMoved 事件以与水平菜单一起使用。因此,用户可以向左/向右滑动,页面就会相应地产生动画。

当用户触摸静态元素(TextBlock 等)时,此方法有效,但如果用户触摸 ListView,则会捕获触摸事件。

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

最佳答案

这是可能的,但你需要一个小技巧。作为引用,我放在这里 Rob Caplan's article .

让我们开始吧:

  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 那样顺利工作。

我还放了一个简单的工作示例 here at OneDrive .

关于c# - ListView 上的水平滚动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23665411/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com