Проблема производительности Listbox с огромными данными в Silverlight 2
Я использую Silverlight 2, в котором у меня возникает проблема производительности при использовании элемента управления Listbox. Я связываю Список объектов из примерно 500 записей, который занимает 3-4 секунды для привязки данных.
Но у меня нет этой проблемы с DataGrid.
У кого-нибудь есть ответ по улучшению проблемы производительности в Listbox?
2 ответа
Причина этого заключается в том, что DataGrid поддерживает виртуализацию пользовательского интерфейса, а ListBox - нет. Это означает, что DataGrid создает только визуальные элементы для видимых элементов, в то время как ListBox создает визуальные элементы для всех своих элементов. Всякий раз, когда вам нужно выбрать из списка элементов, которые могут быть очень большими, используйте DataGrid вместо ListBox. Вы можете стилизовать DataGrid и использовать TemplateColumn, чтобы он выглядел как ListBox.
Майкл
Не зная дополнительного контекста о вашем приложении, может произойти несколько вещей. Первое, что приходит на ум, это то, что у вас очень "тяжелое" визуальное дерево. Каждый элемент в вашем ListBox собирается создать некоторый граф визуальных объектов. Чем больше у вас есть, тем больше времени занимает рендеринг.
Когда эти элементы не видны на экране, Silverlight по-прежнему выполняет работу по их визуализации. По сути это означает, что этапы Layout() и Measure() выполняются для всех связанных с данными элементов ListBox, даже если они не видны.
Хитрость заключается в том, чтобы использовать виртуализацию, чтобы заставить Silverlight не выполнять передачи Layout/Measure для элементов управления, которые в данный момент не видны в видимой области элемента управления.
Вот запись в блоге, которая описывает, как сделать это с помощью StackPanel. Не нужно много времени, чтобы абстрагировать это в ListBox или, что еще лучше, вы можете просто сделать контейнер управления для вашего ListBox панелью стека виртуализации, и тогда все будет готово:)