如何滚动到列表框的底部?

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

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

有什么建议吗?

84413 次浏览

我相信通过适当地设置 TopIndex属性可以很容易地做到这一点。

例如:

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

滚动到底部:

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

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

listbox.SelectedIndex = listbox.Items.Count - 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(); }
};
}
}
}

如果你想要一个 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;

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