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) для быстрой прокрутки до последнего элемента?

Спасибо за ваши идеи:)

0 ответов

Другие вопросы по тегам