Как прокрутить до нижней части ListBox? - PullRequest
57 голосов
/ 10 января 2012

Я использую Winforms ListBox в качестве небольшого списка событий и хочу заполнить его так, чтобы было видно последнее событие (внизу).SelectionMode не имеет значения.Пользователь может прокрутить список, но я бы предпочел, чтобы он начинался с прокрутки до конца.

Глядя на отсутствие поддержки таких вещей, как ScrollIntoView, EnsureVisible, я предполагаю, что мне нужно будет создатьпользовательский элемент управления, который наследуется от ListBox;однако я не уверен, что делать дальше.

Некоторые указатели?

Ответы [ 3 ]

84 голосов
/ 10 января 2012

Полагаю, вы можете легко это сделать, установив свойство TopIndex соответствующим образом.

Например:

int visibleItems = listBox.ClientSize.Height / listBox.ItemHeight;
listBox.TopIndex = Math.Max(listBox.Items.Count - visibleItems + 1, 0);
49 голосов
/ 29 октября 2015

Прокрутите вниз:

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

Прокрутите вниз и выберите последний элемент:

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

1 голос
/ 01 ноября 2018

Это то, что я закончил для 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(); }
            };
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...