Một cách tiếp cận hơi khác so với những gì được trình bày cho đến nay.
Bạn có thể sử dụng sự kiện ScrollViewer
ScrollChanged
và xem nội dung của số ScrollViewer
trở nên lớn hơn.
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();
};
}
}
Điều này tránh một số vấn đề với các ràng buộc để các thay đổi ListBox
ItemsSource
.
Bạn cũng có thể tìm thấy ScrollViewer
mà không giả định rằng ListBox
đang sử dụng mẫu điều khiển mặc định.
// 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;
}
Sau đó đính kèm này với sự kiện ListBox
Loaded
:
<ListBox Loaded="ListBox_OnLoaded" />
này có thể dễ dàng sửa đổi để trở thành một tài sản gắn liền, để làm cho nó mục đích tổng quát hơn.
hai trong số ba liên kết ở đây không tồn tại (và chúng là hai chỉ có tiềm năng để thêm nội dung nào đó hữu ích cho câu hỏi) –