Проблема с производительностью при загрузке большого количества пользовательских элементов управления

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

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

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


person codymanix    schedule 08.01.2011    source источник


Ответы (1)


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

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

Если вам нужна дополнительная информация о виртуализации пользовательского интерфейса, обратитесь к блогу Дэна Кревьера< /а>.

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

  • для UserControl: 4932 мс;
  • для CustomControl: 86 мс (примерно в 57 раз быстрее)

Надеюсь это поможет

person Anvaka    schedule 08.01.2011
comment
Страница MSDN (msdn.microsoft.com/de- de/library/) прямо указывает, что LoadComponent загружает XAML, а не BAML, вот в чем проблема. Поскольку мой UserControl состоит из нескольких других элементов управления, пользовательский элемент управления здесь не будет правильным выбором. - person codymanix; 09.01.2011
comment
Вы хотите использовать виртуализацию пользовательского интерфейса, как предлагается, которая будет отображать только элементы на экране. Использование BAML не улучшит вашу производительность. BAML — это просто скомпилированная версия XAML. - person kevindaub; 09.01.2011
comment
Можете ли вы расширить? Вы можете попробовать переписать свои пользовательские элементы управления в пользовательские элементы управления? Я понимаю разницу между наследованием и композицией, но я не понимаю, почему существует такая резкая разница в производительности. - person Trinition; 21.08.2013
comment
Я думаю, вы могли бы также сделать композицию вместе с наследованием, написав Custom Control. Разница в производительности может быть вызвана разными подходами к построению визуального и логического дерева на основе xmal/baml. Сам UserControl является ContentControl, а Custom Controls (в большинстве случаев) просто подклассом Control. Он должен будет обрабатывать ContentTemplate в случае UserControl. P.S. Я никогда не делал такого теста. - person terry; 24.10.2013