Разделение WPF ResourceDictionary - PullRequest
       6

Разделение WPF ResourceDictionary

1 голос
/ 06 сентября 2010

У меня есть приложение WPF, состоящее из примерно семи пользовательских элементов управления, каждый с различными элементами управления (текстовое поле, поле со списком, переключатель и т. Д.).

Во всем приложении я применил набор стилей управления, взятых из тем WPF в CodePlex, однако со времени применения этих стилей я заметил некоторое замедление работы приложения. ResourceDictionary, содержащий все мои стили, весит около 300 КБ в размере кода.

Будет ли выигрыш, если разделить стили на несколько словарей ресурсов и объединить только стили, которые требуются каждому пользовательскому контролю, а не все стили элементов управления, даже если они не используются.

Как WPF загружает стили в память? Когда требуется или весь ResourceDictionary загружается в память при запуске?

1 Ответ

2 голосов
/ 06 сентября 2010

Когда объект создается из XAML (или BAML), XamlReader десериализует все содержимое XAML. Каждый найденный им элемент XAML создает экземпляр объекта - поэтому элементы Style в элементе UserControl.Resources генерируют Style объекты, которые добавляются в словарь ресурсов пользовательского элемента управления во время десериализации объекта. (На самом деле это немного сложнее, чем это, поскольку, очевидно, есть части десериализации XAML, которые являются асинхронными, но это достаточно близко для целей этого обсуждения.)

Важно понимать, что Resources не является статическим свойством. Каждый экземпляр пользовательского элемента управления имеет свой собственный словарь ресурсов. Если вы поместите 300 стилей в пользовательский элемент управления XAML и создадите 100 пользовательских элементов управления, вы будете создавать 30 000 Style объектов. Это верно, используете ли вы объединенные словари или нет.

Если ваш словарь ресурсов настолько велик, как вы говорите, безусловно, лучшее, что нужно сделать, - это поместить его в свойство Resources приложения. Таким образом, вы платите цену за десериализацию каждого объекта только один раз.

...