2009-09-07 8 views
32

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

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

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

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

ответ

48

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

Первый UI Virtualization и второй Data Virtualization

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

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

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

Надежда, что помогает

9

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

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

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