[英]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應用程序等
對不起,我還沒有准備好博客的完整樣本。 祝好運!
我剛剛為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.