【问题标题】:How to detect scrolling at the end of a listbox for N lists?如何检测 N 个列表的列表框末尾的滚动?
【发布时间】:2019-10-31 03:10:39
【问题描述】:

我发现 this approach by 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 个列表在滚动结束时处理一个事件。

我不知道如何使用这段代码来处理不同的列表...

有没有更好的方法?以及如何将相同的东西用于不同的列表?

【问题讨论】:

标签: c# windows-phone-7 listbox scroll


【解决方案1】:

您可以创建一个继承自 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 上执行相同操作的 Behavior 或附加属性。

【讨论】:

    【解决方案2】:

    您需要做的就是添加一个用于 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;
        }
    

    【讨论】:

      猜你喜欢
      • 2023-01-30
      • 1970-01-01
      • 2019-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-06
      • 2015-08-28
      • 1970-01-01
      相关资源
      最近更新 更多