Проблемы производительности WPF InitializeComponent - PullRequest
7 голосов
/ 24 ноября 2010

У меня есть приложение WPF (.NET 4), у которого есть главное окно, и внутри этого главного окна отображается много меньших UserControls.Различные действия, выполняемые пользователем, приводят к замене отображаемого UserControls другими элементами управления с другими данными.

Однако при переключении этих элементов управления возникают проблемы с производительностью.Поток диспетчера WPF переходит на 100% CPU при загрузке элементов управления.На старых машинах или с большим количеством элементов управления это может привести к блокировке приложения на 30 секунд!

Профилирование означает, что почти все это время ЦП затрачивается на вызов различных InitializeComponent различные методы UserControls - ни один элемент управления не выглядит намного хуже, чем любой другой, кажется, что все они занимают от 0,2 до 0,5 секунды (на моей машине с быстрым процессором и хорошей видеокартой).

Насколько я знаю, InitializeComponent - это место, где WPF фактически загружает скомпилированный xaml в память.

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

В противном случае это выглядит как единственныйу меня есть варианты удалить все мои xaml ??

Любая помощь будет принята с благодарностью

Ответы [ 3 ]

3 голосов
/ 03 сентября 2012

Чтобы вернуться к этому - у нас есть много сложных элементов управления на экране, но мы не можем просто избавиться от них, чтобы сделать WPF счастливым!

Дальнейшие эксперименты с профилированием показали, что использование пользовательских элементов управления (в основном просто класса C #, производного непосредственно от Control и определения пользовательского интерфейса в файле тем Generic.xaml), похоже, вызывает загрузку и разбор XAML один раз. каждый элемент управления просто применяет уже существующую тему.

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

0 голосов
/ 09 августа 2015

Для записи у меня было окно со временем загрузки около 1500 ~ 2000 мс, проблема была в icons .

Я использовал инструмент для преобразования SVG в элементы DrawingImage XAML и пользовательский элемент управления с большим словарем ресурсов с изображением для рисования для каждого используемого значка

InitializeComponent был очень медленным, потому что ему приходилось анализировать этот большой XAML-файл, содержащий все векторные данные для изображений

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

0 голосов
/ 24 ноября 2010

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

Мое единственное предложение - можно ли инициализироватьвсе потенциальные элементы управления с самого начала, а затем показывать / скрывать их при необходимости, используя свойство Visibility?

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

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