WPF VirtualizingStackPanel для повышения производительности
Я хотел бы простое описание того, как реализовать панель виртуализации для ItemsControl
это связано с ObservableCollection
в моем MVVM.
у меня есть ItemsControl
экземпляр для каждой вкладки в элементе управления вкладками, и переключение вкладок становится ОЧЕНЬ медленным, когда ItemsControl
становится больше.
Что я могу сделать, чтобы ускорить приложение?
Я открыл профилировщик WPF и увидел, что каждый элемент (пользовательский элемент управления), отображаемый в моем ItemsControl каждой вкладки, имеет свой собственный ContentPresenter
, Таким образом, у меня было 100 докладчиков контента, работающих на 100 элементов в моем ObservableCollection
в МВВМ. Это правильно? Как я могу оптимизировать?
2 ответа
Есть две техники, которые могут оказать большую помощь. Обе они очень хорошо описаны Бе Стольниц в ее блоге.
Первый - это виртуализация пользовательского интерфейса, а второй - виртуализация данных.
В виртуализации пользовательского интерфейса вы используете такие вещи, как VirtualizingStackPanel, чтобы пользовательский интерфейс рисовал меньше вещей.
Виртуализация данных гарантирует, что вы не внесете в память миллион объектов, когда вы собираетесь показывать только 100.
Таким образом, виртуализация пользовательского интерфейса минимизирует количество элементов, которые можно нарисовать, а виртуализация данных - количество элементов, которые можно нарисовать.
надеюсь, это поможет
У меня была точно такая же проблема в WPF с использованием TabControl и DataGrid. При увеличении размера элемента DataGrid переключение вкладок становится ОЧЕНЬ медленным! После этого я обнаружил этот пост, читая блог от Bea Stolnitz, как и предполагалось предыдущим ответом. Это дало мне подсказку для Google "wpf tabcontrol VirtualizingStackPanel", который дает мне ссылку на DrWPF: http://groups.google.com/group/wpf-disciples/browse_thread/thread/6f3531a1720252dd
Он точно описывает проблему и дает решение:-))
.... Удар перфоратора происходит во время строительства дерева. К сожалению, если
вы используете типичный подход MVVM с привязкой к ItemsSource
свойство TabControl, все дерево должно быть перестроено каждый раз
элемент вкладки выбран. Это обычно очень дорогая операция.....