WPF VirtualizingStackPanel для повышения производительности

Мне нужно простое описание того, как реализовать панель стека виртуализации для ItemsControl, которая привязана к данным ObservableCollection в моем MVVM.

У меня есть экземпляр ItemsControl для каждой вкладки в элементе управления вкладками, и переключение вкладок становится ОЧЕНЬ медленным, когда ItemsControl становится больше.

Что я могу сделать, чтобы ускорить работу приложения?

Я открыл профилировщик WPF и увидел, что каждый элемент (который является пользовательским элементом управления), отображаемый в моем ItemsControl на каждой вкладке, имеет свой собственный ContentPresenter. Таким образом, у меня было 100 презентаторов контента, каждый из которых выполнял 100 элементов в моем ObservableCollection в MVVM. Это правильно? Как я могу оптимизировать?


person bluebit    schedule 07.09.2009    source источник


Ответы (2)


Есть две техники, которые могут оказаться очень полезными. Оба они очень хорошо описаны Беа Столниц в ее блог.

Первый — это виртуализация пользовательского интерфейса а второй — виртуализация данных< /а>

В виртуализации пользовательского интерфейса вы используете такие вещи, как VirtualizingStackPanel, чтобы пользовательский интерфейс рисовал меньше вещей.

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

Таким образом, виртуализация пользовательского интерфейса сводит к минимуму количество отрисовываемых объектов, а виртуализация данных сводит к минимуму количество отрисовываемых объектов.

надеюсь, это поможет

person Mike Two    schedule 21.09.2009

У меня была точно такая же проблема с WPF с использованием TabControl и DataGrid. При увеличении размера элемента DataGrid переключение вкладок становится ОЧЕНЬ медленным! После этого я нашел этот пост, читая блог Беа Столниц, как предполагалось в предыдущем ответе. Это дало мне подсказку для Google "wpf tabcontrol VirtualizingStackPanel", который дает мне ссылку на DrWPF: http://groups.google.com/group/wpf-disciples/browse_thread/thread/6f3531a1720252dd

Точно описывает проблему и дает решение :-))

.... Перфорация происходит во время построения дерева. К сожалению, если
вы используете типичный подход MVVM с привязкой к свойству ItemsSource
TabControl, все дерево должно перестраиваться каждый раз
при выборе элемента вкладки. Обычно это очень дорогая операция. ....

person user227789    schedule 09.12.2009