Как прокручивать список в ListBox?
Я использую Winforms ListBox как небольшой список событий и хочу заполнить его так, чтобы было видно последнее событие (внизу). Для параметра SelectionMode
установлено значение none. Пользователь может прокручивать список, но я бы предпочел, чтобы он начинался с прокрутки до конца.
Глядя на отсутствие поддержки таких вещей, как ScrollIntoView
, EnsureVisible
, я предполагаю, что мне нужно будет создать настраиваемый элемент управления, который наследуется от ListBox; однако я не уверен, что делать дальше.
Некоторые указатели?
Ответы
Ответ 1
Я считаю, что вы можете сделать это легко, установив свойство TopIndex
соответствующим образом.
Например:
int visibleItems = listBox.ClientSize.Height / listBox.ItemHeight;
listBox.TopIndex = Math.Max(listBox.Items.Count - visibleItems + 1, 0);
Ответ 2
Прокрутите вниз:
listbox.TopIndex = listbox.Items.Count - 1;
Прокрутите вниз и выберите последний элемент:
listbox.SelectedIndex = listbox.Items.Count - 1;
Ответ 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(); }
};
}
}
}