Подтвердить что ты не робот

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

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

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

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

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

4b9b3361

Ответ 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, все дерево необходимо перестраивать каждый раз
выбирается элемент табуляции. Это, как правило, очень дорогостоящая операция.....