Производительность Silverlight с множеством загруженных элементов управления

У меня есть SL-приложение со многими DataGrids (из Silverlight Toolkit), каждое в своем представлении. Если несколько DataGrids открываются, переключение между представлениями (например, TabItems) занимает много времени (несколько секунд) и приводит к зависанию всего приложения (потока пользовательского интерфейса)

Чем больше загружено DataGrids, тем больше времени занимает изменение.Эти DataGrid, которые замедляют изменение пользовательского интерфейса, могут быть в других местах приложения и даже не видны в этот момент. Но как только они открыты (и загружены данными), они замедляют отображение других DataGrid. Обратите внимание, что DataGrids НЕ удаляется, а затем снова создается заново, они по-прежнему остаются в памяти, только их родительский элемент управления снова скрыт и виден.

Я профилировал приложение. Это показывает, что функция SetValue agcore.dll является узким местом. К сожалению, отладочные символы недоступны для этой родной библиотеки Silverlight, отвечающей за отрисовку.

Проблема не в контроле DataGrid - пробовал заменить на сетку XCeed и производительность при смене видов еще хуже.

Есть идеи, как решить эту проблему? Почему более открытые элементы управления замедляют работу других элементов управления?

Я создал пример, демонстрирующий эту проблему: Решение VS , живая демонстрация

ОБНОВЛЕНИЕ: Использование профилировщика VS11 в предоставленном образце предполагает, что проблема может заключаться в том, что MeasureOverride вызывается много раз (я думаю, для каждой ячейки DataGridCell). Но, тем не менее, почему это происходит медленнее, когда в другом месте загружается больше элементов управления?Есть ли способ улучшить производительность?

ОБНОВЛЕНИЕ 2: Я должен упомянуть, что я не использую TabControl в своем конкретном приложении. Я использую Caliburn.Micro и ContentControl, чтобы показать текущую активную ViewModel. Но та же проблема с TabControl, поэтому я использовал его для описания основной проблемы.

10
задан gius 25 March 2012 в 11:10
поделиться