C# 如何检测ListView何时下降,何时上升
我有一个带有动态内容的ListView(本机),我想知道如何检测用户何时滚动它,但不是“isScrolling=true/false”的样式,而是想知道用户何时向上滚动它,何时向下滚动它 我试过这个把戏: 但问题是,它只返回“true/false”(实际上它触发了一个Sub),并且它也会淹没Sub(我的意思是,我非常努力地滚动列表视图,并且Sub被触发了多次,所以它的操作被监听) 我不知道是否有一种本地方式(比如一个事件作为操纵delta[它不起作用])或者其他类似于该帖子的技巧 这是我目前的代码:C# 如何检测ListView何时下降,何时上升,c#,vb.net,windows-phone,C#,Vb.net,Windows Phone,我有一个带有动态内容的ListView(本机),我想知道如何检测用户何时滚动它,但不是“isScrolling=true/false”的样式,而是想知道用户何时向上滚动它,何时向下滚动它 我试过这个把戏: 但问题是,它只返回“true/false”(实际上它触发了一个Sub),并且它也会淹没Sub(我的意思是,我非常努力地滚动列表视图,并且Sub被触发了多次,所以它的操作被监听) 我不知道是否有一种本地方式(比如一个事件作为操纵delta[它不起作用])或者其他类似于该帖子的技巧 这是我目前的代
'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,当Cab向下(隐藏)时返回False,goDownSub()是一个隐藏“Cab”的子对象
注2:这段代码是用VB(VisualBasic)编写的,但我也用C。我对用C#而不是VB生成的答案没有任何问题。Hmm,因为listview本身包含一个内置的滚动查看器。您不能将此控件放在另一个滚动查看器中并轻松获取滚动偏移,我的建议是在ScrollViwer中使用堆栈面板,在ScrollViwer的ViewChanged事件中监视更改,并通过VerticalOffset()方法获取当前偏移量。好的,我找到了一种获取listview位置的方法 下面的代码是从
var scrollViewer=FindScrollViewer(列表框);
var offset=scrollViewer.VerticalOffset;
静态ScrollViewer FindScrollViewer(DependencyObject父对象)
{
var childCount=VisualTreeHelper.GetChildrenCount(父级);
对于(变量i=0;i
然后可以确定listview滚动到哪个方向:
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;
}
Double offSetNew,offSetOld
私有void LVNot_ViewChanged()
{
动态滚动查看器=FindScrollViewer(LVNot);
offSetNew=ScrollViewer.VerticalOffset;
如果(offSetOld!=0){//避免在第一个实例中触发(offSetOld>offSetNew)
如果(offSetOld>offSetNew){
//上升
}else if(offSetOld
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;
}