GridView не прокручивается до виртуализированных элементов - PullRequest
0 голосов
/ 29 мая 2020

В моем приложении мне нужно выбрать только что созданный документ (заметку), когда я go вернусь в библиотеку. После выбора элемента библиотеки необходимо прокрутить библиотеку до выбранного элемента.

Метод OnLoaded моей библиотеки:

private async void OnLoaded(object sender, RoutedEventArgs e)
{
   await this.ViewModel.InitializeAsync();

   // CollectionViewSource of my GridView being filled
   ViewModel.CollectionChanging = true;
   GroupInfoCVS.Source = ViewModel.GroupsCollection;
   ViewModel.CollectionChanging = false;

   // Loading Last selected item - THIS CHANGES SELECTION
   ViewModel.LoadLastSelection();
}

После вызова метода LoadLastSelection выбор успешно изменен (I ' тестировал). Это метод, который вызывается после этого (в расширенном элементе управления GridView):

private void OnSelectionChanged(object sender, SelectionChangedEventArgs e)
{
    this.SelectedItemsCount = this.SelectedItems.Count;

    var newlySelectedItems = e.AddedItems;
    if (newlySelectedItems.Any())
    {
        var item = newlySelectedItems.Last();
        ScrollTo(item);
    }
}

private void ScrollTo(object item)
{
    UpdateLayout();
    var itemUI = (FrameworkElement)this.ContainerFromItem(item);

    if (itemUI != null)
    {
        _scrollViewer.UpdateLayout();
        _scrollViewer.ChangeView(null, itemUI.ActualOffset.Y - itemUI.ActualHeight, null, false);
    }
}

Это также работает по большей части. Если itemUI не равен нулю, метод успешно переходит к требуемому элементу. Проблемы начинаются, когда элементы начинают выходить за пределы экрана. Когда элементы полностью скрыты с экрана, они виртуализируются. Это означает, что ContainerFromItem возвращает значение null, поэтому я не могу использовать свойства смещения. Имейте в виду, что это на самом деле происходит до того, как метод OnLoaded библиотеки будет завершен.

Пожалуйста, помогите мне с какой-нибудь альтернативой, чтобы получить такие свойства или другие методы прокрутки, которые помогут мне успешно прокручивать.

Я много читал и пробовал использовать методы Dispatcher.RunAsyn c и ScrollIntoView, но мне не удалось добиться какого-либо поведения при прокрутке. Если вы укажете мне, как их успешно использовать, это тоже будет хорошим подспорьем.

Вот что я читал (и пробовал):

ItemContainerGenerator.ContainerFromItem () возвращает null?

Как узнать, когда элемент FrameworkElement был полностью отрисован?

Есть ли в WPF * 1030 событие «Все дочерние элементы загружены» *

Разрешить ListView прокрутить до выбранного элемента

Заранее спасибо!

1 Ответ

1 голос
/ 01 июня 2020

Для GridView лучший способ удовлетворить ваши потребности - позвонить GridView.ScrollIntoView.

Но похоже, что вы уже предпринимали аналогичные попытки, и это не увенчалось успехом, тогда могут быть следующие моменты Вам поможет:

1. Не используйте GridView в качестве дочернего элемента ScrollViewer.

Я вижу, что в вашем коде вы вызываете метод ScrollViewer.ChangeView для настройки прокрутки представления, так что это предположил, что вы можете поместить GridView в ScrollViewer, что не рекомендуется.

Потому что внутри GridView находится ScrollViewer, и его метод ScrollIntoView заключается в изменении области прокрутки внутреннего ScrollViewer. Когда есть ScrollViewer снаружи, ScrollViewer внутри GridView потеряет возможность прокрутки, что сделает метод ScrollIntoView недействительным.

2. Реализуйте метод Equals класса данных.

Если ваш класс данных не является простым типом (например, String, Int32, и c.), Тогда реализуйте Метод Equals класса данных поможет GridView найти соответствующий элемент.

Спасибо.

...