当用户滚动到 Windows Phone 中的列表末尾时加载数据在 5 或 6 次滚动后停止

Loading Data when the User Scrolls to the End of a List in Windows Phone stops after 5 or 6 scrolls

我正在开发一个 Windows Phone 8.1 应用程序,其中有一个包含大量数据项的列表页面。

所以我决定在ListBox上实现增量加载。幸运的是,我从 Danial vaugan 的 Loading Data when the User Scrolls to the End of a List in Windows Phone 7 样本

那里得到了解决方案

而且滚动效果很好。但注意到在 5 或 6 次增量加载后,Scrollviewer 偏移更改不起作用。从那时起,这个概念就不起作用了。

Here 是我在 Daniel Vaughan 的示例项目中仅加载 79 个项目的示例。之后滚动更改不起作用。

ScrollViewer 是否有任何限制以防止其偏移量在特定值后发生变化?但我不这么认为,因为我一次加载了 1000 多个项目并且它平滑地滚动到最后。

如何解决这个问题?

这是一个不使用 MVVM 的简单实现。这个想法是得到 ListViewScrollViewer.

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;
}

您需要为 onLoaded 添加事件处理程序。

ScrollViewer viewer = GetScrollViewer(this.storylist);
    viewer.ViewChanged += MainPage_ViewChanged;

和MainPage_ViewChanged事件处理程序一样。

private async void MainPage_ViewChanged(object sender, ScrollViewerViewChangedEventArgs e)
{
    ScrollViewer view = (ScrollViewer)sender;
    double progress = view.VerticalOffset / view.ScrollableHeight;
    System.Diagnostics.Debug.WriteLine(progress);
    if (progress > 0.7 & !incall && !endoflist)
    {
        incall = true;
        fetchCountries(++offset);
    }
}

这是一步一步的 tutorial

这并不整洁,因为它不遵循 MVVM 模式。幸运的是 WP 8.1 支持 ISupportIncrementalLoading,可以按照 this article 中的描述实现。

最后找到了另一种方法来获得解决方案。使用 Longlist Selector 控制增量列表加载。它按预期工作。

Reference:

TwitterSearch - Windows Phone 8 LongListSelector Infinite Scrolling Sample