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

У меня есть приложение 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, поэтому я использовал ее для описания основной проблемы.

Ответ 2

Мы столкнулись с чем-то похожим на это, мы загрузили много мощных элементов управления, управляемых пользователем, динамически, и чем больше было показано, тем медленнее было приложение. Как сумасшедший, как это звучит, когда мы устанавливаем корень компоновки каждого элемента управления на пограничный элемент управления, проблемы с производительностью значительно уменьшились, так как макетной системе не пришлось так сильно бороться, чтобы обновлять все ресурсы.

Просто хотел поделиться чем-то, что сработало для нас чудом, что вы можете попробовать.

Ответ 3

Это полудикая догадка, но мне интересно, поможет ли она установить Visibility to Collapsed на вкладках, которые не выбраны. (Я предполагаю, что виртуализация строк включена в DataGrid. Это очень помогло мне в прошлом.)

Моя полудикая догадка основана главным образом на этом подсказка и на моем промежуточном понимании найденной информации здесь.

Ответ 4

У меня была проблема с c1DataGrid, я обнаружил, что после отключения тем, изменение вкладок было быстрым, и выполнение других операций пользовательского интерфейса было мгновенным.

Также попробуйте:

  • Убедитесь, что ни один из ваших кодов не вызывается путем перехода через VS.
  • Удалить все применяемые стили
  • если все еще медленно устранять компонент по компоненту, возможно, это не только сетка данных
  • замените datagrid на c1datagrid