Производительность Silverlight со многими загруженными элементами управления - PullRequest
10 голосов
/ 18 марта 2012

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

Ответы [ 4 ]

5 голосов
/ 27 марта 2012

Итак, я последовал идее создания пользовательского элемента управления, и вот результат: http://www.baud.cz/blog/fast-switching-between-viewmodels-in-caliburn.micro.

Быстрые ссылки на демонстрационные приложения MVVM: Оригинал и Исправлено

0 голосов
/ 23 сентября 2013

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

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

  1. Убедитесь, что ни один из ваших кодов не вызывается, пройдя через VS.
  2. Удалите все примененные стили
  3. , есливсе еще медленно устраняйте компонент за компонентом, возможно, это не просто сетка данных
  4. замените вашу сетку данных на c1datagrid
0 голосов
/ 22 марта 2012

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

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

0 голосов
/ 22 марта 2012

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

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

...