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