如何检测ListView向上或向下滚动

时间:2014-12-04 12:44:42

标签: xaml winrt-xaml windows-phone-8.1 win-universal-app winrt-xaml-toolkit

有没有办法检测ScrollViwer ListView处于滚动模式并停止滚动。在Windows Phone 8.1 ListView中,我们无法获得scrollviewer的参考。

有人在Windows Phone 8.1 WinRT应用程序中完成了吗?

3 个答案:

答案 0 :(得分:6)

ListView为Loaded后,您可以获得ScrollViewer,如下所示:

var sv = (ScrollViewer)VisualTreeHelper.GetChild(VisualTreeHelper.GetChild(this.ListV, 0), 0);

修改

正如Romasz建议的那样,一旦获得ScrollViewer,就可以使用其ViewChanged事件来监控滚动时间和停止时间。

此外,这是我用于遍历可视树的通用扩展方法:

// The method traverses the visual tree lazily, layer by layer
// and returns the objects of the desired type
public static IEnumerable<T> GetChildrenOfType<T>(this DependencyObject start) where T : class 
{
    var queue = new Queue<DependencyObject>();
    queue.Enqueue(start);

    while (queue.Count > 0) {
        var item = queue.Dequeue();

        var realItem = item as T;
        if (realItem != null) {
             yield return realItem;
        }

        int count = VisualTreeHelper.GetChildrenCount(item);
        for (int i = 0; i < count; i++) {
            queue.Enqueue(VisualTreeHelper.GetChild(item, i));
        }
    }
}

要使用此方法获取ScrollViewer,请执行以下操作:

var sv = yourListView.GetChildrenOfType<ScrollViewer>().First();

答案 1 :(得分:4)

您可以使用 VisualTreeHelper 找到 ListView ScrollViewer 。例如:

// method to pull out a ScrollViewer
public static ScrollViewer GetScrollViewer(DependencyObject depObj)
{
    if (depObj is ScrollViewer) return depObj as ScrollViewer;

    for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++)
    {
        var child = VisualTreeHelper.GetChild(depObj, i);

        var result = GetScrollViewer(child);
        if (result != null) return result;
    }
    return null;
}

获得 ScrollViewer 后,您可以订阅其活动:

GetScrollViewer(yourListView).ViewChanged += yourEvent_ViewChanged;

答案 2 :(得分:-1)

在获取scrollview之前,您必须将数据加载到listview。如果listview有空行,那么你得到的scrollview将为null。