2011-01-08 3 views
3

Мое приложение загружает кучу одного и того же пользовательского элемента управления в ScrollPanel. Проблема в том, что это очень медленно.Ошибка производительности при загрузке множества пользовательских элементов управления

Профилировщик показывает, что метод Application.LoadComponent(), который внутренне определяется кодом конструктора моего пользовательского элемента управления, является узким местом. Документация по этому методу говорит, что этот метод загружает файлы XAML.

Вопрос в том, как я могу использовать BAML вместо XAML? Как я могу добиться того, что XAML для моего пользовательского элемента управления не должен повторяться снова и снова при создании из него новых экземпляров? Есть ли другой способ ускорить загрузку моих пользовательских элементов управления?

ответ

5

LoadComponent() уже загружает .baml, не беспокойтесь об этой части вопроса. Microsoft сделала это намеренно, чтобы разработчики не делали зависимости от формата baml. В будущем они могут улучшить формат без нарушения существующих приложений.

Да, есть еще один способ заставить его работать быстрее. Первая оптимизация - UI virtualization. WPF уже поставляется с удобным VirtualizingStackPanel. Он работает в тандеме с ItemsControls и имеет определенные ограничения (например, если вы создаете контейнеры товаров и добавляете их самостоятельно, вы теряете виртуализацию, или если вы установили ScrollViewer.CanContentScroll="False", вы снова потеряете его). Для того, чтобы использовать виртуализацию вам, возможно, придется переписать приложение, чтобы использовать ItemsControl + DataBinding стиль (ListBox уже виртуализация включена)

Если вы чувствуете, как вам нужно еще больше информации о виртуализации UI сослаться на Dan Crevier's blog.

И окончательный совет. Вы можете попробовать переписать свои UserControls в пользовательские элементы управления. Мой простой тест производительности показал следующие цифры. Для создания 10K управлений с тем же визуальным деревом потребовалось:

  • для UserControl: 4932ms;
  • для CustomControl: 86ms; (~ 57 раз быстрее)

Надеется, что это помогает

+0

страницы MSDN (http://msdn.microsoft.com/de-de/library/system.windows.application.loadcomponent.aspx) состояний явно, что LoadComponent загружает XAML, а не BAML, вот в чем проблема. Поскольку мой UserControl представляет собой состав нескольких других элементов управления, пользовательский элемент управления не будет правильным выбором здесь. – codymanix

+1

Вы хотите использовать виртуализацию пользовательского интерфейса, как было предложено, в котором будут отображаться только элементы на экране. Использование BAML не улучшит вашу производительность. BAML - это просто скомпилированная версия XAML. – kevindaub

+2

Можете ли вы перейти на «Вы можете попробовать переписать свои UserControls в пользовательские элементы управления»? Я понимаю разницу в том, что касается наследования и композиции, но я не понимаю, почему существует такая драматическая разница в производительности. – Trinition

Смежные вопросы