WPF VirtualizingStackPanel для повышения производительности
Мне бы хотелось просто описать, как реализовать виртуальную стеклизацию для ItemsControl
, которая привязана к привязке к ObservableCollection
в моем MVVM.
У меня есть экземпляр ItemsControl
для каждой вкладки в элементе управления вкладкой, а вкладки переключения становятся ОЧЕНЬ медленными, когда размер ItemsControl
увеличивается.
Что я могу сделать, чтобы ускорить работу приложения?
Я открыл профилировщик WPF и увидел, что каждый элемент (который является пользовательским элементом управления), отображаемый в моей ItemsControl каждой вкладки, имеет свой собственный ContentPresenter
. Таким образом, у меня по существу было 100 презентаторов контента, работающих на 100 элементов в моем ObservableCollection
в MVVM. Это правильно? Как я могу оптимизировать?
Ответы
Ответ 1
Есть два метода, которые могут быть большой помощью. Оба они очень хорошо описаны Bea Stolnitz на ее blog.
Первая Виртуализация пользовательского интерфейса
а второй - Виртуализация данных
В виртуализации пользовательского интерфейса вы используете такие вещи, как VirtualizingStackPanel, чтобы сделать пользовательский интерфейс меньше.
Виртуализация данных гарантирует, что вы не принесете миллион объектов в память, когда вы покажете только 100.
Таким образом, виртуализация пользовательского интерфейса минимизирует количество нарисованных вещей и виртуализацию данных сводит к минимуму количество вещей, которые могут быть нарисованы.
Надеюсь, что поможет
Ответ 2
У меня была точно такая же проблема, как и 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, все дерево необходимо перестраивать каждый раз
выбирается элемент табуляции. Это, как правило, очень дорогостоящая операция.....