我正在尝试实现这样一个效果,即当用户向下滚动到最后一项时,会附加更多的项目到列表中。我还没有找到一种方法来确定用户是否已经滚动到了列表的末尾。我没有看到 ListBox 上触发的事件,告诉我用户何时到达列表底部。如果有一些东西告诉我何时滚动到视图中的项目,那就太好了,但据我所知,没有这样的东西。
在WP7中,这种效果是否可行?
编辑:另一种表述方式是,我们能否检测到列表已经“弹回”?
在WP7中,这种效果是否可行?
编辑:另一种表述方式是,我们能否检测到列表已经“弹回”?
我刚刚为Overflow7实现了这个功能。
我采用的方法类似于http://blog.slimcode.com/2010/09/11/detect-when-a-listbox-scrolls-to-its-end-wp7/
不过,我没有使用样式,而是在代码中进行了钩子连接。
基本上,我将父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();
}
get
在虚拟化列表上由 UI 调用)会触发加载更多数据。它有两个好处:用户立即得知列表正在加载,并且加载操作实际上发生在它进入视图之前的某个时间。因此,在高速连接上,用户永远看不到条目跳动。 - Agent_L