如何检测N个列表框中滚动到末尾的情况?

3

我发现了SlimCode的这种方法,可以创建出下面这种效果:

public static readonly DependencyProperty ListVerticalOffsetProperty = DependencyProperty.Register(
  "ListVerticalOffset",
  typeof( double ),
  typeof( SearchBusinessResultsPage ),
  new PropertyMetadata( new PropertyChangedCallback( OnListVerticalOffsetChanged ) ) );

public double ListVerticalOffset
{
  get { return ( double )this.GetValue( ListVerticalOffsetProperty ); }
  set { this.SetValue( ListVerticalOffsetProperty, value ); }
}

private static void OnListVerticalOffsetChanged( DependencyObject obj, DependencyPropertyChangedEventArgs e )
{
    // ...
}

它创建了一个单一的readonly属性和一个单一的静态方法来处理它。但我想让N个列表在滚动结束时处理一个事件。
我不知道如何使用这段代码来处理不同的列表...
有没有更好的方法?我该如何在不同的列表中使用相同的东西?

这个有用吗?假设您已将应用程序更新到7.1版本。http://blogs.msdn.com/b/slmperf/archive/2011/06/30/windows-phone-mango-change-listbox-how-to-detect-compression-end-of-scroll-states.aspx - Justin XL
2个回答

0
您可以创建一个继承自ListBox的BusinessListBox类,并按照所提到的示例定义其样式和模板。然后,您可以扩展DependencyProperty更改处理程序以具有实例更改处理程序方法。
private static void OnListVerticalOffsetChanged(
    DependencyObject d, DependencyPropertyChangedEventArgs e)
{
    var target = (BusinessListBox)d;
    double oldListVerticalOffset = (double)e.OldValue;
    double newListVerticalOffset = target.ListVerticalOffset;
    target.OnListVerticalOffsetChanged(oldListVerticalOffset, newListVerticalOffset);
}

private void OnListVerticalOffsetChanged(
    double oldListVerticalOffset, double newListVerticalOffset)
{
}

理想情况下,您只需实现一个行为或附加属性,即可在常规 ListBox 上执行相同的操作。

0
你所需要做的就是添加一个ScrollChangedEvent检测处理程序,并使用VerticalOffset属性来判断滚动是否已经到达了滚动条的末尾。
 listBox.AddHandler(ScrollViewer.ScrollChangedEvent, new ScrollChangedEventHandler((o , e) => {
            ListBox lb = (ListBox) o;
            ScrollViewer sv = GetDescendantByType(lb, typeof(ScrollViewer)) as ScrollViewer;
            if (sv.ScrollableHeight == sv.VerticalOffset) { 
                //End of the scroll reached
            }
        }));

在 ListBox 中查找 ScrollViewer 的辅助方法。
   /***
    * Helper method to traverse the root to find the the element of type `type`
    ***/
    public static Visual GetDescendantByType(Visual element, Type type) {
        if (element == null) {
            return null;
        }
        if (element.GetType() == type) {
            return element;
        }
        Visual foundElement = null;

        for (int i = 0; i < VisualTreeHelper.GetChildrenCount(element); i++) {
            Visual visual = VisualTreeHelper.GetChild(element, i) as Visual;
            foundElement = GetDescendantByType(visual, type);
            if (foundElement != null) {
                break;
            }
        }
        return foundElement;
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接