【问题标题】:How to scroll to bottom of ListBox?如何滚动到 ListBox 底部?
【发布时间】:2012-02-06 11:30:18
【问题描述】:

我使用 Winforms ListBox 作为事件的小列表,并希望填充它以便最后一个事件(底部)可见。 SelectionMode 设置为无。用户可以滚动列表,但我希望它从滚动到末尾开始。

鉴于缺乏对ScrollIntoViewEnsureVisible 之类的支持,我假设我需要创建一个继承自 ListBox 的自定义控件;但是我不确定从那里做什么。

一些指针?

【问题讨论】:

  • 普通的listBox1.SelectedIndex = listBox1.Items.Count - 1; 不适合你吗?
  • SelectionMode 未设置为None 时有效。我需要防止选择此特定列表中的项目(以避免用户混淆)。

标签: c# winforms listbox


【解决方案1】:

我相信您可以通过适当地设置TopIndex 属性轻松做到这一点。

例如:

int visibleItems = listBox.ClientSize.Height / listBox.ItemHeight;
listBox.TopIndex = Math.Max(listBox.Items.Count - visibleItems + 1, 0);

【讨论】:

  • +1 有点复杂,但这当然不是你的错!感谢您的解决方案和示例。
  • 如果您只是将TopIndex 设置为最后一项而不是担心哪个应该真正位于顶部,那么它似乎工作正常,例如listBox.TopIndex = listBox.Items.Count - 1;
【解决方案2】:

滚动到底部:

listbox.TopIndex = listbox.Items.Count - 1;

滚动到底部,然后选择最后一项:

listbox.SelectedIndex = listbox.Items.Count - 1;

【讨论】:

  • 我更喜欢这个解决方案,简单得多。谢谢!
  • 最佳解决方案,
  • 我的 ListBox 没有 TopIndex 属性(不知道为什么)并且设置 SelectedIndex 不会滚动到选择。
  • @Malcolm 你在用winforms吗?
  • @markf78 WPF,我的错。那会教我掩盖问题标签>_
【解决方案3】:

这就是我最终为 WPF(.Net Framework 4.6.1)所做的:

Scroll.ToBottom(listBox);

使用以下实用程序类:

public partial class Scroll
{
    private static ScrollViewer FindViewer(DependencyObject root)
    {
        var queue = new Queue<DependencyObject>(new[] { root });

        do
        {
            var item = queue.Dequeue();
            if (item is ScrollViewer) { return (ScrollViewer)item; }
            var count = VisualTreeHelper.GetChildrenCount(item);
            for (var i = 0; i < count; i++) { queue.Enqueue(VisualTreeHelper.GetChild(item, i)); }
        } while (queue.Count > 0);

        return null;
    }

    public static void ToBottom(ListBox listBox)
    {
        var scrollViewer = FindViewer(listBox);

        if (scrollViewer != null)
        {
            scrollViewer.ScrollChanged += (o, args) =>
            {
                if (args.ExtentHeightChange > 0) { scrollViewer.ScrollToBottom(); }
            };
        }
    }
}

【讨论】:

  • 问题被标记为 WinForms。
  • @LarsTech 这是一个很好的观点,但我的回答可能会帮助一些 WPF 人,是吗?
【解决方案4】:

如果您想要一个“在底部时粘在底部”的 winforms 列表框,您可以:

int visibleItems = lb.ClientSize.Height / lb.ItemHeight;
if (lb.Items.Count > lb && lb.TopIndex > lb.Items.Count - visibleItems - 2)
  lb.TopIndex = lb.Items.Count - visibleItems + 1;

当滚动到底部时,新项目会导致它向下滚动以显示它们,但是如果您向上滚动一点,它就会停止“跳到底部”的行为,因此您可以继续查看您向上滚动到的内容见

【讨论】:

    猜你喜欢
    • 2013-07-22
    • 1970-01-01
    • 2020-09-24
    • 2014-12-12
    • 2010-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多