【问题标题】:Detect when WPF listview scrollbar is at the bottom?检测 WPF listview 滚动条何时位于底部?
【发布时间】:2010-11-21 01:06:44
【问题描述】:

有没有办法检测ListViewScrollViewer 的滚动条是否已到达虚拟滚动空间的底部?我想检测到这一点以从服务器获取更多项目以放入ListView 上的绑定ObservableCollection

现在我正在这样做:

private void currentTagNotContactsList_scrollChanged(object sender, ScrollChangedEventArgs e) {

    ListView v = (ListView)sender;


    if (e.VerticalOffset + e.ViewportHeight == e.ExtentHeight) {
        Debug.Print("At the bottom of the list!");
    }

}

这是否正确?我还需要区分导致事件的垂直滚动条和导致事件的水平滚动条(即,如果您在框底部水平滚动,我不想继续生成对服务器的调用)。

谢谢。

【问题讨论】:

    标签: c# wpf listview scroll


    【解决方案1】:
    //A small change in the "Max's" answer to stop the repeatedly call.
    //this line to stop the repeatedly call
    ScrollViewer.CanContentScroll="False"
    
    private void dtGrid_ScrollChanged(object sender, ScrollChangedEventArgs e)
                    {
    //this is for vertical check & will avoid the call at the load time (first time)
                        if (e.VerticalChange > 0)
                        {
                            if (e.VerticalOffset + e.ViewportHeight == e.ExtentHeight)
                            {
                                // Do your Stuff
                            }
                        }
                    }
    

    【讨论】:

    • 接受的答案不适用于使用鼠标滚轮滚动。这个做到了。所以+1。
    【解决方案2】:

    我想通了。看来我应该从 ScrollBar(XAML 中的<ListView ScrollBar.Scroll="currentTagNotContactsList_Scroll")本身而不是查看器获取事件。这可行,但我只需要想办法避免在滚动条向下时重复调用事件处理程序。也许计时器会很好:

    private void currentTagNotContactsList_Scroll(object sender, ScrollEventArgs e) {
    
        ScrollBar sb = e.OriginalSource as ScrollBar;
    
        if (sb.Orientation == Orientation.Horizontal)
            return;
    
        if (sb.Value == sb.Maximum) {
            Debug.Print("At the bottom of the list!");
    
        }
    
    }
    

    【讨论】:

    • ScrollBar.Scroll 在 Windows 10 中不存在 ListView .. 如何在 Windows 10 中实现此要求
    【解决方案3】:

    对于 UWP 我是这样理解的

    <ScrollViewer Name="scroll" ViewChanged="scroll_ViewChanged">
        <ListView />
    </ScrollViewer>
    
    private void scroll_ViewChanged(object sender, ScrollViewerViewChangedEventArgs e)
    {
        var scrollViewer = (ScrollViewer)sender;
        if (scrollViewer.VerticalOffset == scrollViewer.ScrollableHeight)
                btnNewUpdates.Visibility = Visibility.Visible;
    }
    

    【讨论】:

    • 也适用于 WPF,使用 ScrollChanged="ScrollViewerScrollChangedEvent" ... +1
    • @dnxit 你把滚动查看器放在哪里?由于我在单个 UWP 页面上有多个列表视图,我如何将特定的滚动查看器与列表视图相关联?
    【解决方案4】:

    你可以试试这个方法:

     <ListView ScrollViewer.ScrollChanged="Scroll_ScrollChanged">
    

    在后面:

     private void Scroll_ScrollChanged(object sender, ScrollChangedEventArgs e)
        {
            // Get the border of the listview (first child of a listview)
            Decorator border = VisualTreeHelper.GetChild(sender as ListView, 0) as Decorator;
            // Get scrollviewer
            ScrollViewer scrollViewer = border.Child as ScrollViewer;
            if (scrollViewer.VerticalOffset == scrollViewer.ScrollableHeight)
            Debug.Print("At the bottom of the list!");
        }
    

    【讨论】:

      【解决方案5】:

      不建议使用 ScrollBar.Scroll ,因为如果你滚动鼠标中间的滚轮,它就不起作用了。

      ScrollBar.Scroll="currentTagNotContactsList_Scroll"

      以下支持右侧滚动条和鼠标滚轮滚动。

      在列表框的 xmal 中:

                       ScrollViewer.ScrollChanged="ScrollViewer_ScrollChanged"
      

      在 C# 中:

              private void ScrollViewer_ScrollChanged(object sender, ScrollChangedEventArgs e)
          {
                  var listBox = (ListBox)sender;
                  var scrollViewer =  (ScrollViewer)VisualTreeHelper.GetChild(listBox, 0);
      
                  if (scrollViewer.VerticalOffset == scrollViewer.ScrollableHeight)
                  {
                      Console.WriteLine("____At the bottom of the list!");
                  }
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-11-03
        • 2016-07-07
        • 1970-01-01
        • 2020-10-11
        • 2014-12-12
        相关资源
        最近更新 更多