Ответ 1
Итак, я последовал идее создания настраиваемого элемента управления, и вот результат: http://www.baud.cz/blog/fast-switching-between-viewmodels-in-caliburn.micro.
Быстрые ссылки на демонстрационные приложения MVVM: Оригинал и Исправлено
У меня есть приложение 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, поэтому я использовал ее для описания основной проблемы.
Итак, я последовал идее создания настраиваемого элемента управления, и вот результат: http://www.baud.cz/blog/fast-switching-between-viewmodels-in-caliburn.micro.
Быстрые ссылки на демонстрационные приложения MVVM: Оригинал и Исправлено
Мы столкнулись с чем-то похожим на это, мы загрузили много мощных элементов управления, управляемых пользователем, динамически, и чем больше было показано, тем медленнее было приложение. Как сумасшедший, как это звучит, когда мы устанавливаем корень компоновки каждого элемента управления на пограничный элемент управления, проблемы с производительностью значительно уменьшились, так как макетной системе не пришлось так сильно бороться, чтобы обновлять все ресурсы.
Просто хотел поделиться чем-то, что сработало для нас чудом, что вы можете попробовать.
Это полудикая догадка, но мне интересно, поможет ли она установить Visibility to Collapsed на вкладках, которые не выбраны. (Я предполагаю, что виртуализация строк включена в DataGrid. Это очень помогло мне в прошлом.)
Моя полудикая догадка основана главным образом на этом подсказка и на моем промежуточном понимании найденной информации здесь.
У меня была проблема с c1DataGrid, я обнаружил, что после отключения тем, изменение вкладок было быстрым, и выполнение других операций пользовательского интерфейса было мгновенным.
Также попробуйте: