如何检测 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;
}
我有一个带有动态内容的 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;
}