如何检测 ListView 何时下降以及何时上升

How to Detect when a ListView goes Down and when it goes Up

我有一个带有动态内容的 ListView(本机),我想知道如何检测用户何时滚动它,而不是 "isScrolling = true/false" 的样式,而是我想知道用户何时滚动它向上,当用户向下滚动时。

我试过这个技巧: 但问题是它只是 return "true/false" (实际上它触发了一个 Sub)并且它也淹没了 Sub(我的意思是,我非常努力地滚动 ListView 并且 Sub 被多次触发,所以它被窃听的操作)。

我不知道是否有原生方式(比如 ManipulationDelta 事件 [它不起作用])或其他类似的技巧 post。

这是我现在的代码:

'On a shared file'
Public Shared Function GetScrollViewer(depObj As DependencyObject) As ScrollViewer
    If TypeOf depObj Is ScrollViewer Then
        Return TryCast(depObj, ScrollViewer)
    End If

    For i As Integer = 0 To VisualTreeHelper.GetChildrenCount(depObj) - 1
        Dim child = VisualTreeHelper.GetChild(depObj, i)

        Dim result = GetScrollViewer(child)
        If result IsNot Nothing Then
            Return result
        End If
    Next
    Return Nothing
End Function

'on OnNavigatedTo event'
AddHandler GetScrollViewer(LVNot).ViewChanged, AddressOf LVNot_ViewChanged

'At the end of the Main.xaml.vb file'
Private Sub LVNot_ViewChanged()
    If Cab.isUp = True Then
        Cab.goDownSub()
    End If
End Sub

注意 1:"Cab" 是一个 "Custom AppBar control"(用户控件),isUp 是一个布尔值,return 当 Cab 启动时为真(可见),当它关闭时为假(隐藏) ,而 goDownSub() 是一个隐藏 "Cab"

的 Sub

注意 2:此代码是使用 VB (VisualBasic) 编写的,但我也使用 C#。我对用 C# 而不是 VB.

做出的回答没有任何问题

嗯,因为列表视图本身包含一个内置的滚动查看器,您不能将此控件放在另一个滚动查看器中并轻松获得滚动偏移,我的建议是在 ScrollViwer 中使用堆栈面板并监视事件的变化scrollViwer 的 ViewChanged 并通过 VerticalOffset() 方法获取当前偏移量。

好的,我找到了获取列表视图位置的方法。

以下代码摘自

var scrollViewer = FindScrollViewer(listBox);
var offset = scrollViewer.VerticalOffset;

static ScrollViewer FindScrollViewer(DependencyObject parent)
{
    var childCount = VisualTreeHelper.GetChildrenCount(parent);
    for (var i = 0; i < childCount; i++)
    {
        var elt = VisualTreeHelper.GetChild(parent, i);
        if (elt is ScrollViewer) return (ScrollViewer)elt;
        var result = FindScrollViewer(elt);
        if (result != null) return result;
    }
    return null;
}

然后可以确定列表视图滚动到哪个方向:

Double offSetNew, offSetOld

private void LVNot_ViewChanged()
{
    dynamic ScrollViewer = FindScrollViewer(LVNot);
    offSetNew = ScrollViewer.VerticalOffset;

    if (offSetOld != 0) { //To avoid (offSetOld > offSetNew) being fired in the first instance
        if (offSetOld > offSetNew) {
            //Go Up
        } else if (offSetOld < offSetNew) {
            //Go Down
        }
    }

    offSetOld = offSetNew;
}