如何滚动到ListBox的底部?

时间:2012-01-09 23:40:03

标签: c# winforms listbox

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

考虑到对ScrollIntoViewEnsureVisible等内容缺乏支持,我假设我需要创建一个继承自ListBox的自定义控件;但是我不知道该怎么做。

一些指示?

4 个答案:

答案 0 :(得分:82)

我相信你可以通过恰当地设置TopIndex属性来轻松完成。

例如:

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

答案 1 :(得分:43)

滚动到底部:

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

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

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

答案 2 :(得分:1)

这是我最终使用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(); }
            };
        }
    }
}

答案 3 :(得分:0)

如果你想要一个“在底部时粘在底部”的 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;

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