Проблемы с производительностью при загрузке большого количества пользовательских элементов управления - PullRequest
3 голосов
/ 08 января 2011

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

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

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

1 Ответ

5 голосов
/ 09 января 2011

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

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...