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

#c# #observablecollection #uno-platform

Вопрос:

Я работаю над проектом Uno, используя как UWP, так и WASM. Проект содержит представление списка или сетки с источником, представляющим собой наблюдаемую коллекцию. Так как он получает данные из API. Я отображаю индикатор прогресса, и я нахожу, что индикатор прогресса остается активным до тех пор, пока коллекция ObservableCollection не будет заполнена элементами данных.

Проблема в том, что существует задержка между тем, когда у ObservableCollection есть данные, и когда элемент управления завершает визуализацию представления. В этом случае это наблюдаемая коллекция изображений, и представление сетки или списка не заполняется.

Я не смог определить и событие, которое подскажет мне, когда следует отключить индикатор прогресса.

Комментарии:

1. А как насчет использования progressBar1.IsIndeterminate = false; ??

Ответ №1:

В API WinUI не определено событие, которое сообщало бы вам, когда пользовательский интерфейс завершил рендеринг, поэтому вам нужно создать свое собственное. Это может быть полезно, когда у вас сложный, тяжелый пользовательский интерфейс, для визуализации которого требуется видимая задержка после получения данных.

Существует несколько возможных стратегий:

  • скрыть индикатор выполнения после фиксированной задержки.
  • Запланируйте обратный вызов с помощью CoreDispatcher.RunIdleAsync() . Это должно быть вызвано только тогда, когда поток пользовательского интерфейса не «занят», что является приблизительным прокси-сервером для завершения рендеринга. Напр.: Dispatcher.RunIdleAsync(_ => progressRing.IsActive = false);
  • Специфично для ListView / ItemsControl : Вы можете проверить, что в списке действительно есть представления элементов с ContainerFromIndex() помощью метода, например listView.ContainerFromIndex(expectedIndex) != null . Будьте осторожны, так как список создает контейнеры только для элементов, которые действительно находятся в поле зрения.
  • Специфика Image : Изображения, полученные с удаленных URL-адресов, загружаются асинхронно. Вы можете подписаться на ImageOpened мероприятие, чтобы получить обратный вызов, когда изображение будет готово.

Вероятно, вам придется поэкспериментировать, чтобы найти то, что лучше всего работает в вашем сценарии; это не точная наука. Если возможно, рекомендуется протестировать несколько устройств с различными характеристиками.

Комментарии:

1. Я хотел бы проследить за этим. Решение CoreDispatcher, похоже, не сработало. Он вернет значение false, и все равно будет значительная задержка до отображения изображений. ContainerFromIndex() делает то же самое независимо от того, какой индекс я установил. Я добавлю, что индикатор прогресса также проблематичен, потому что он фактически зависает во время процесса рендеринга, поэтому похоже, что приложение зависает. Я не могу поверить, что я единственный, кто видит это в сборках платформы wasm.

2. Действительно, изображения обрабатываются несколько иначе, чем другие элементы управления, я добавил некоторую конкретную информацию. Для замораживания индикатора прогресса это ограничение анимации в WASM в настоящее время, которые выполняются в потоке пользовательского интерфейса. Могут быть альтернативные подходы, но я бы предложил задать новый вопрос конкретно об этом.