【问题标题】:Scroll a ListBox's VirtualizingStackPanel with buttons使用按钮滚动 ListBox 的 VirtualizingStackPanel
【发布时间】:2010-06-17 22:17:36
【问题描述】:

我有一个列表框,一次水平显示 5 个项目。我想实现一个“上一个”和“下一个”按钮,单击该按钮将显示上一组 5 个或下一组 5 个项目。我没有显示水平滚动条,因为我不希望用户使用它来导航。

是否已经实现了一些功能以便我可以执行此操作,或者我是否需要编写代码来计算我在按钮的点击事件中显示的项目等?

提前致谢!

【问题讨论】:

    标签: c# wpf virtualizingstackpanel


    【解决方案1】:

    您可以使用内置的 ScrollViewer.PageUp() 和 ScrollViewer.PageDown() 命令,如下所示:

    public void ShowNextPage()
    {
       InvokeOnScrollViewer(listBox, viewer => viewer.PageDown());
    }
    
    public void ShowPriorPage()
    {
       InvokeOnScrollViewer(listBox, viewer => viewer.PageUp());
    }
    
    public void InvokeOnScrollViewer(ItemsControl control, Action<ScrollViewer> action)
    {
      for(Visual vis = control as Visual; VisualTreeHelper.GetChildCount(vis)!=0; vis = VisualTreeHelper.GetChild(vis, 0))
        if(vis is ScrollViewer)
        {
          Action((ScrollViewer)vis);
          break;
        }
    }
    

    工作原理:InvokeOnScrollViewer 向下扫描可视化树,直到找到 ScrollViewer,然后对其调用给定的操作,即 PageUp() 或 PageDown()。

    当您的 ItemsPanel 是 StackPanel(无论方向、虚拟化与否)时,ScrollViewer.PageUp() 向后移动一个视口,而 ScrollViewer.PageDown() 向前移动一个视口。换句话说,如果您的 ListBox 显示五个项目,那么这些命令会将其移动五个项目。

    【讨论】:

    • 嗨,Ray,我正在使用这个实现来解决我在这里遇到的一个新问题stackoverflow.com/questions/3098383/… -- 想开动脑筋,看看你是否对我为什么会遇到一些问题有任何想法.再次感谢您迄今为止的帮助!
    【解决方案2】:

    【讨论】:

    • 正在寻找诸如 DisplayNext() 之类的东西或已经实现的东西——以防我忽略了一些非常简单的东西。我打算实现 ScrollIntoView 但在我做之前想确定一下。感谢您的回答。
    • 这个答案是错误的,或者至少是误导性的。您可以使用 ScrollViewer.PageUp() 和 ScrollViewer.PageDown() 来完全按照您的要求进行操作。我刚刚写了一个解释如何的答案。
    • 坚持住雷。为什么说是错的?更笼统的是,是的,但没有错。
    • Ray 的答案是我一直在寻找的那种功能。
    猜你喜欢
    • 1970-01-01
    • 2010-12-27
    • 1970-01-01
    • 2012-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多