Немного другой подход к представленным.
Вы можете использовать событие ScrollViewer
ScrollChanged
и смотреть, как содержимое ScrollViewer
становится больше.
private void ListBox_OnLoaded(object sender, RoutedEventArgs e)
{
var listBox = (ListBox) sender;
var scrollViewer = FindScrollViewer(listBox);
if (scrollViewer != null)
{
scrollViewer.ScrollChanged += (o, args) =>
{
if (args.ExtentHeightChange > 0)
scrollViewer.ScrollToBottom();
};
}
}
Это позволяет избежать некоторых проблем с привязкой к изменению ListBox
ItemsSource
.
ScrollViewer
также можно найти, не предполагая, что ListBox
использует шаблон элемента управления по умолчанию.
// Search for ScrollViewer, breadth-first
private static ScrollViewer FindScrollViewer(DependencyObject root)
{
var queue = new Queue<DependencyObject>(new[] {root});
do
{
var item = queue.Dequeue();
if (item is ScrollViewer)
return (ScrollViewer) item;
for (var i = 0; i < VisualTreeHelper.GetChildrenCount(item); i++)
queue.Enqueue(VisualTreeHelper.GetChild(item, i));
} while (queue.Count > 0);
return null;
}
Затем присоедините это к событию ListBox
Loaded
:
<ListBox Loaded="ListBox_OnLoaded" />
Это может быть легко изменено, чтобы быть присоединенным свойством, чтобы сделать его более универсальным.