如何检测ListView何时下降和何时上升

本文关键字:何时 何时下 ListView 何检测 检测 | 更新日期: 2023-09-27 18:28:04

我有一个带有动态内容的ListView(原生),我想知道如何检测用户何时滚动它,但不是"isScrolling=true/false"的风格,而是想知道用户何时向上滚动,何时向下滚动。

我试过这个把戏:https://stackoverflow.com/a/27294644/4668642但问题是,它只返回"true/false"(实际上它激发了一个Sub),它也淹没了Sub(我的意思是,我非常用力地滚动ListView,Sub被激发了多次,所以它的操作被窃听了)。

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

这是我现在的代码:

'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"是一个"自定义AppBar控件"(UserControl),isUp是一个布尔值,当Cab向上(可见)时返回True,当它向下(隐藏)时返回False,goDownSub()是一个隐藏"Cab"的Sub

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

如何检测ListView何时下降和何时上升

做出的回答没有任何问题

嗯,由于listview本身包含一个内置的滚动查看器,您无法将此控件放在另一个滚动查看器中并轻松获取滚动偏移量,我的建议是在ScrollViwer中使用堆栈面板,并在ScrollViwer的ViewChanged事件中监控更改,并通过VerticalOffset()方法获取当前偏移量。

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

以下代码摘自https://stackoverflow.com/a/4954586/4668642

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;
}