Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何检测ListView何时下降,何时上升_C#_Vb.net_Windows Phone - Fatal编程技术网

C# 如何检测ListView何时下降,何时上升

C# 如何检测ListView何时下降,何时上升,c#,vb.net,windows-phone,C#,Vb.net,Windows Phone,我有一个带有动态内容的ListView(本机),我想知道如何检测用户何时滚动它,但不是“isScrolling=true/false”的样式,而是想知道用户何时向上滚动它,何时向下滚动它 我试过这个把戏: 但问题是,它只返回“true/false”(实际上它触发了一个Sub),并且它也会淹没Sub(我的意思是,我非常努力地滚动列表视图,并且Sub被触发了多次,所以它的操作被监听) 我不知道是否有一种本地方式(比如一个事件作为操纵delta[它不起作用])或者其他类似于该帖子的技巧 这是我目前的代

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