Un enfoque ligeramente diferente a las presentadas hasta ahora.
Puede utilizar el evento ScrollViewer
ScrollChanged
y ver si aumenta el contenido del 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();
};
}
}
Esto evita algunos problemas con la unión al ListBox
ItemsSource
cambiante.
También se puede encontrar el ScrollViewer
sin suponer que el ListBox
está utilizando la plantilla de control predeterminada.
// 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;
}
A continuación, conecte este al evento ListBox
Loaded
:
<ListBox Loaded="ListBox_OnLoaded" />
Esto podría ser fácilmente modificado para ser una propiedad adjunta, para que sea el propósito más general.
dos de los tres enlaces aquí están desaparecidos (y son los únicos dos con algún potencial para agregar algo útil a la pregunta) –