У меня есть SL-приложение со многими DataGrids (из Silverlight Toolkit), каждое из которых имеет свой собственный вид.Если открыто несколько DataGrids, переключение между представлениями (например, TabItems) занимает много времени (несколько секунд) и останавливает все приложение (поток пользовательского интерфейса).
Чем больше загружено DataGrids, тем больше времени занимает изменение.Эти DataGrids, которые замедляют изменение пользовательского интерфейса, могут быть в других местах приложения и даже не видны в данный момент.Но как только они открыты (и загружены данными), они медленно показывают другие DataGrids.Обратите внимание, что DataGrids НЕ удаляются и затем воссоздаются заново, они все еще остаются в памяти, только их родительский элемент управления скрыт и снова виден.
Я профилировал приложение.Это показывает, что функция SetValue agcore.dll является узким местом.К сожалению, символы отладки недоступны для этой собственной библиотеки Silverlight, отвечающей за рисование.
Проблема не в элементе управления DataGrid - я попытался заменить его на сетку XCeed, а производительность при смене представлений еще хуже.
У вас есть идеи, как решить эту проблему? Почему более открытые элементы управления замедляют работу других элементов управления?
Я создал образец, показывающий эту проблему: VS solution , live demo
ОБНОВЛЕНИЕ: Использование профилировщика VS11 в предоставленном образце предполагает, что проблема может быть в том, что MeasureOverride вызывается много раз (я полагаю, для каждого DataGridCell).Но все же, почему он медленнее, поскольку в другом месте загружается больше элементов управления? Есть ли способ улучшить производительность?
ОБНОВЛЕНИЕ 2: Я должен упомянуть, что я не использую TabControl в моемконкретное применение.Я использую Caliburn.Micro и ContentControl, чтобы показать текущую активную ViewModel.Но та же проблема с TabControl, поэтому я использовал его для описания основной проблемы.