簡體   English   中英

到達最后一項時WP7 Auto Grow ListBox

[英]WP7 Auto Grow ListBox upon reaching the last item

我正在嘗試實現一種效果,當用戶向下滾動到最后一項時,更多項目將附加到列表中。 我還沒有找到一種方法來確定用戶是否已滾動到列表的末尾。 我沒有在ListBox上看到當用戶到達列表底部時觸發的事件。 告訴我什么時候一個項目滾動到視圖中的東西會很棒,但據我所知,沒有類似的東西。

這在WP7中甚至可能嗎?

編輯:另一種說法是,我們可以檢測到列表何時被“反彈”?

Daniel Vaughan在http://danielvaughan.orpius.com/post/Scroll-Based-Data-Loading-in-Windows-Phone-7.aspx上發布了一個如何檢測這個問題的例子。

由於有很多移動部件,所以不容易上手,但是這就是你可以做的,假設你需要一個簡短的列表,當你向下滾動時從你的數據中加載更多,類似於很多twitter應用程序等

  • 編寫自己的ObservableCollection子類,它只提供一些項目(如20),保持其余部分保持不變直到請求
  • 連接到滾動查看器(在列表框或容器內)及其可視狀態更改事件,您可以獲得NotScrolling和滾動更改; 例如, 請參閱ptorr的此代碼
  • 當滾動停止時,使用查看器滾動擴展代碼來查看事物的擴展位置(在底部與否)或僅僅是原始滾動查看器屬性,以查看它是否擴展到底部
  • 如果是這樣,觸發您的可觀察集合以釋放另一組項目。

對不起,我還沒有准備好博客的完整樣本。 祝好運!

我剛剛為Overflow7實現了這個功能。

我采用的方法類似於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壓縮狀態

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM