WPF улучшает автопрокрутку до вновь добавленного элемента в DataGrid VirtualingStackPanel
У меня есть этот код для реализации поведения "автопрокрутки к вновь добавленному элементу" в DataGrid с VirtualingStackPanel (Mode = recycling):
protected override void OnItemsSourceChanged(System.Collections.IEnumerable oldValue, System.Collections.IEnumerable newValue)
{
base.OnItemsSourceChanged(oldValue, newValue);
if (oldValue is INotifyCollectionChanged)
(oldValue as INotifyCollectionChanged).CollectionChanged -= ItemsCollectionChanged;
if (!(newValue is INotifyCollectionChanged)) return;
(newValue as INotifyCollectionChanged).CollectionChanged += ItemsCollectionChanged;
}
public override void OnApplyTemplate()
{
base.OnApplyTemplate();
// Dig out and store a reference to our internal ScrollViewer
_scrollViewer = RecursiveVisualChildFinder<ScrollViewer>(this) as ScrollViewer;
_vsp = GetInnerStackPanel(this);
if (_scrollViewer != null )
{
//UpdateLayout();
_scrollViewer.ScrollToBottom();
}
}
private void ItemsCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
if (_scrollViewer != null && e.Action == NotifyCollectionChangedAction.Add)
{
//UpdateLayout();
//_needRefresh = true;
_stopWatch.Start();
_scrollViewer.ScrollToBottom();
_stopWatch.Stop();
_measures.Add(_stopWatch.ElapsedMilliseconds);
}
}
Проблема с этим решением заключается в производительности: вызов "_scrollViewer.ScrollToBottom()" является линейным по времени к количеству элементов: например: в моем тесте у меня есть коэффициент, такой как 1 мс для 1000 элементов, поэтому, если у меня больше, чем 1 000 000 предметов, автопрокрутка займет больше 1 секунды!
Как получить сетку данных (или любой ItemControl с VirtualingStackPanel) для быстрой прокрутки до последнего элемента?
Спасибо за ваши идеи:)