我正在尝试实现一种效果,当用户向下滚动到最后一项时,会有更多项目附加到列表中。我还没有找到一种方法来确定用户是否已滚动到列表的末尾。我没有在ListBox上看到当用户到达列表底部时触发的事件。告诉我什么时候一个项目滚动到视图中的东西会很棒,但据我所知,没有类似的东西。
这在WP7中是否可行?
编辑:另一种说法是,我们可以检测到列表何时被“退回”?
答案 0 :(得分:7)
Daniel Vaughan在http://danielvaughan.orpius.com/post/Scroll-Based-Data-Loading-in-Windows-Phone-7.aspx
发布了一个如何检测此问题的示例答案 1 :(得分:5)
由于有很多移动部件,所以不容易上手,但是这里有你可以做的,假设你需要一个简短的列表,当你向下滚动时从你的数据中加载更多,类似于很多推特应用等等。
抱歉,我还没有准备好博客的完整示例。祝你好运!
答案 2 :(得分:5)
我刚刚为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 - 我确信有更好的方法...
答案 3 :(得分:0)
从msdn blog
查看此detect Listbox compression state答案 4 :(得分:-1)