Я пытаюсь улучшить производительность с помощью своего приложения WPF, и у меня возникают проблемы со сложным элементом ItemsControl. Хотя я добавил виртуализацию, все еще есть проблема с производительностью, и я думаю, что я решил, почему.Есть ли способ использовать виртуализацию со скрытыми панелями или расширителями?
Каждый элемент содержит ряд расширяемых областей. Таким образом, пользователь видит сводку в начале, но может развернуться, расширяя, чтобы увидеть больше информации. Вот как это выглядит:
Как вы можете видеть, что есть некоторые вложенные ItemsControls. Таким образом, каждый элемент верхнего уровня имеет кучу скрытых элементов управления. Виртуализация предотвращает загрузку элементов вне экрана, но не скрытые элементы самих элементов. В результате относительно простая первоначальная компоновка занимает значительное время. Выбрасывая некоторые из этих просмотров, 87% времени тратится на разбор и макет, и загрузка занимает несколько секунд.
Я бы предпочел, чтобы потребовалось 200 мс для расширения, когда (если!) Пользователь решает, а не 2s, чтобы загрузить страницу в целом.
Просить совета действительно. Однако я не могу придумать хороший способ добавления элементов управления с помощью MVVM. Есть ли какой-либо расширитель или виртуализация на основе видимости, поддерживаемая в WPF, или я буду создавать свою собственную реализацию?
87% показатель приходит от диагностики:
Что такое * «скрытые элементы внутри самих элементов» *? Виртуализация не создаст [ContentPresenter'] (http://stackoverflow.com/a/12437064/1997232), но где-то у вас есть 'ObservableCollection <>', который должен быть полностью загружен. Итак, что это за '2s' включает? Вы сделали профилирование, чтобы увидеть, что на самом деле является узким местом? – Sinatr
Вы хотите виртуализировать часть элемента, которая находится внутри 'Expander' (для созданных элементов)? Если да, то вы можете обрабатывать свернутое состояние в ViewModel, чтобы ** добавить больше данных ** при его расширении (например, используя 'object' для хранения этого шаблона данных и данных, чтобы создать визуальную визуальность, если это не' null'). – Sinatr
Вот как это делается. Вы можете отложить получение данных до тех пор, пока они не будут открыты. Я удивлен, что занимает 2 секунды. – Paparazzi