#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 в настоящее время, которые выполняются в потоке пользовательского интерфейса. Могут быть альтернативные подходы, но я бы предложил задать новый вопрос конкретно об этом.