C# 到达最后一项时WP7自动增长列表框

C# 到达最后一项时WP7自动增长列表框,c#,silverlight,windows-phone-7,listbox,scroll,C#,Silverlight,Windows Phone 7,Listbox,Scroll,我试图实现这样一种效果:当用户向下滚动到最后一个项目时,列表中会追加更多的项目。我还没有找到确定用户是否已滚动到列表末尾的方法。我在ListBox上没有看到当用户到达列表底部时触发的事件。当一个项目被滚动到视图中时,能够告诉我这一点是很好的,但据我所知,并没有这样的事情 这在WP7中可能吗 编辑:另一种说法是,我们能检测到列表何时“反弹”吗?使用。由于有很多移动的部分,所以启动起来不是很容易,但这里是你可以做的,假设你想要一个短列表,在你向下滚动时从你的数据中加载更多内容,类似于许多twitte

我试图实现这样一种效果:当用户向下滚动到最后一个项目时,列表中会追加更多的项目。我还没有找到确定用户是否已滚动到列表末尾的方法。我在ListBox上没有看到当用户到达列表底部时触发的事件。当一个项目被滚动到视图中时,能够告诉我这一点是很好的,但据我所知,并没有这样的事情

这在WP7中可能吗


编辑:另一种说法是,我们能检测到列表何时“反弹”吗?

使用。

由于有很多移动的部分,所以启动起来不是很容易,但这里是你可以做的,假设你想要一个短列表,在你向下滚动时从你的数据中加载更多内容,类似于许多twitter应用程序,等等

  • 编写您自己的ObservaleCollection子类,该子类只提供少数项(如20项),其余项保留在请求之前
  • 连接到滚动查看器(在列表框或容器内)及其可视状态更改事件,可以获得NotScrolling和Scrolling更改;例如
  • 当滚动停止时,使用查看东西扩展到哪里(在底部或不在底部),或者仅使用原始滚动查看器属性查看它是否扩展到底部
  • 如果是这样,请触发您的可观察集合以释放另一组项

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

我刚刚为您实现了此功能

我采取的方法与

然而,我没有使用样式,而是在代码中进行了连接

基本上,我的父用户控件源自:

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

“黑客”这里的事情是,我必须使用ListBox1_操作完成和VisualTreeHelper来找到我的ScrollViewer-我相信有更好的方法…

丹尼尔·沃恩在

上发布了一个如何检测的示例,请从msdn博客查看一下这一点

不幸的是,这不是正在寻找的效果。不幸的是,这会导致内存泄漏,如中所述。结果是GC不会发布使用此技术的页面。@Agent_L-您知道Windows Phone 8是否解决了此问题吗?我不能说我理解它,但我刚刚在他的W8 Unreleased中实现了Daniel Vaughans的新版本,并希望确保我没有遗漏任何东西。@Jimmyt1988我不知道,我使用了其他解决方案。IMHO所有基于达到精确滚动端的概念都有缺陷。用户可能几乎滚动到最后,因此永远不会触发加载操作。我正在使用添加到列表末尾的额外项,该项始终显示“加载”,并且该项进入视图(
get
被虚拟化列表上的UI调用)会触发加载更多数据。它有两个好处:用户会立即被告知列表正在加载,而加载操作实际上是在它进入视图之前的一段时间发生的。所以在快速连接中,用户永远看不到项目跳入。