当用户滚动到 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 的简单实现。这个想法是得到 ListView
的 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;
}
您需要为 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
我正在开发一个 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 的简单实现。这个想法是得到 ListView
的 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;
}
您需要为 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