到达最后一项时WP7 Auto Grow ListBox

我正在尝试实现一种效果,当用户向下滚动到最后一项时,会有更多项目附加到列表中。 我还没有找到一种方法来确定用户是否已滚动到列表的末尾。 我没有在ListBox上看到当用户到达列表底部时触发的事件。 告诉我什么时候一个项目滚动到视图中的东西会很棒,但据我所知,没有类似的东西。

这在WP7中甚至可能吗?

编辑:另一种说法是,我们可以检测到列表何时“退回”?

Daniel Vaughan在http://danielvaughan.orpius.com/post/Scroll-Based-Data-Loading-in-Windows-Phone-7.aspx上发布了一个如何检测这个问题的例子。

由于有很多移动部件,所以不容易上手,但是这里有你可以做的,假设你需要一个简短的列表,当你向下滚动时从你的数据中加载更多,类似于很多twitter应用程序等

  • 编写自己的ObservableCollection子类,只提供一些项目(如20),保持其余部分保持不变直到请求
  • 连接到滚动查看器(在列表框或容器内)及其可视状态更改事件,您可以获得NotScrolling和滚动更改; 例如, 请参阅ptorr的此代码
  • 当滚动停止时,使用查看器滚动扩展代码来查看事物的扩展位置(在底部或不在底部)或只是原始滚动查看器属性以查看它是否扩展到底部
  • 如果是这样,触发您的可观察集合以释放另一组项目。

对不起,我还没有准备好博客的完整样本。 祝好运!

我刚刚为Overflow7实现了这个function。

我采取的方法类似于http://blog.slimcode.com/2010/09/11/detect-when-a-listbox-scrolls-to-its-end-wp7/

但是,我没有使用Style,而是在代码中进行了连接。

基本上派生我的父UserControl来自:

  public class BaseExtendedListUserControl : UserControl { DependencyProperty ListVerticalOffsetProperty = DependencyProperty.Register( "ListVerticalOffset", typeof(double), typeof(BaseExtendedListUserControl), new PropertyMetadata(new PropertyChangedCallback(OnListVerticalOffsetChanged))); private ScrollViewer _listScrollViewer; protected void EnsureBoundToScrollViewer() { if (_listScrollViewer != null) return; var elements = VisualTreeHelper.FindElementsInHostCoordinates(new Rect(0,0,this.Width, this.Height), this); _listScrollViewer = elements.Where(x => x is ScrollViewer).FirstOrDefault() as ScrollViewer; if (_listScrollViewer == null) return; Binding binding = new Binding(); binding.Source = _listScrollViewer; binding.Path = new PropertyPath("VerticalOffset"); binding.Mode = BindingMode.OneWay; this.SetBinding(ListVerticalOffsetProperty, binding); } public double ListVerticalOffset { get { return (double)this.GetValue(ListVerticalOffsetProperty); } set { this.SetValue(ListVerticalOffsetProperty, value); } } private static void OnListVerticalOffsetChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e) { BaseExtendedListUserControl control = obj as BaseExtendedListUserControl; control.OnListVerticalOffsetChanged(); } private void OnListVerticalOffsetChanged() { OnListVerticalOffsetChanged(_listScrollViewer); } protected virtual void OnListVerticalOffsetChanged(ScrollViewer s) { // do nothing } } 

这意味着在用户控件本身我可以使用:

  protected override void OnListVerticalOffsetChanged(ScrollViewer viewer) { // Trigger when at the end of the viewport if (viewer.VerticalOffset >= viewer.ScrollableHeight) { if (MoreClick != null) { MoreClick(this, new RoutedEventArgs()); } } } private void ListBox1_ManipulationCompleted(object sender, ManipulationCompletedEventArgs e) { EnsureBoundToScrollViewer(); } 

这里的“hacky”是我必须使用ListBox1_ManipulationCompleted和VisualTreeHelper来查找我的ScrollViewer – 我确信有更好的方法……

从msdn blog看看这个检测Listbox压缩状态

使用DeferredLoadListBox 。