如何检测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本身包含一个内置的滚动查看器,您无法将此控件放在另一个滚动查看器中并轻松获取滚动偏移量,我的建议是在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;
}