Настроить производительность приложения WPF, на котором размещены сотни подобных элементов управления - PullRequest
4 голосов
/ 19 октября 2010

Мы только что перенесли наше приложение WinForms в WPF. Тем не менее, производительность резко снизилась.

У нас есть пользовательский интерфейс, который состоит из около 200 пользовательских элементов управления. Каждый UserControl определяется сеткой данных (= 10 столбцов и 3-15 строк), а также панелью, на которой размещено около 10 кнопок.

Все они размещены в ScrollViewer.

(Пожалуйста, не рекомендуется менять пользовательский интерфейс. Я не имею на это никакого влияния. Клиент хочет иметь возможность прокручивать любой из этих элементов UserControls.)

Поскольку мы перенесли все приложение в WPF, время запуска увеличилось на 100%. Используя WinForms, мы испытывали время запуска 15 секунд, тогда как сейчас мы боремся с 30 секундами.

Есть ли у вас какие-либо рекомендации или идеи, как улучшить время загрузки пользовательского интерфейса, который состоит из идентичного UserControl, где просто каждый UserControl связан с другой ViewModel? (Может быть, какое-то быстрое клонирование экземпляров UserControl или чего-то подобного?)

Я использую статические ресурсы везде, где это возможно. Я избегаю сетки и авторазмера везде, где это возможно.

Надеюсь, кто-нибудь поделится своими мыслями по этому поводу.

Спасибо, TH

Ответы [ 5 ]

2 голосов
/ 16 ноября 2010

Мое окончательное решение - пользовательская виртуальная панель, которая поддерживает элементы динамической высоты.

См. http://rhnatiuk.wordpress.com/2006/12/13/implementing-a-virtualized-panel-in-wpf/ о том, как создавать виртуальные панели.

Мои UserControls поддерживают два состояния:- Initial - Loaded

Когда приложение находится в режиме ожидания, виртуальная панель просит элементы управления перейти в состояние «Loaded».Это загружает дорогой UserControl.

Как будто все загружено лениво, и как только пользователь прекращает прокручивать, загружаются видимые элементы.

Возможно, это помогает другим, находящимся в той же ситуации.TH

2 голосов
/ 19 октября 2010

Сначала выясните, что отвечает за время.

Может быть, это контроли, а может и нет.Часто это структура данных.

Я использую метод случайной паузы .

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

Я помню, что читал кое-что о том, как каждый экземпляр UserControl загружает словарь ресурсов. Так что, если у вас их столько, сколько вы описываете, их загрузка может занять некоторое время.

К сожалению, я не могу найти ссылку, которую помню, но вот одна, которая может помочь: http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/c9b6aa9f-5a97-428c-8009-5cda432b820c

Другая вещь, которую стоит попробовать, - это не использовать UserControls, а вместо этого использовать DataTemplate для построения ваших сетей данных и кнопок. Или создайте пользовательский шаблон элемента управления для сетки данных, включающей кнопки. Любой из них может быть быстрее.

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

0 голосов
/ 22 октября 2010

Ребята, я подумал о следующей реализации. Если у кого-то есть проблемы, пожалуйста, дайте мне знать:

Я реализую свою собственную виртуализацию StackPanel, которая поддерживает плавную прокрутку.

На данный момент мы предполагаем, что высота моих UserControls фиксирована. Одна страница может содержать 5 пользовательских элементов управления.

Затем я продолжу кешировать предыдущую и следующую страницу:

В памяти я всегда буду хранить 15 пользовательских элементов управления. Содержимое ScrollViewer - это Canvas. Расположение моих UserControls регулируется настройкой Canvas.Top. Допустим, текущая ситуация выглядит следующим образом:

Пользователь прокрутил страницу 2. Это означает, что UserControl 5-9 виден. Теперь пользователь прокручивает вниз. Как только UserControl 5 становится невидимым, я беру UC вершины (в данном случае UserControl 0), меняю его ViewModel и настраиваю его Canvas.Top так, чтобы он теперь был элементом управления, который находится в конце ControlCollection. Если пользователь прокручивает дальше, я беру UC 1, меняю его ViewModel и настраиваю его Canvas.Top. И так далее.

Кроме того, я установлю Canvas.Height вручную, чтобы ScrollViewer правильно представлял полосы прокрутки.

Надеюсь, мое объяснение понятно:)

Что вы думаете?

BR, TH

0 голосов
/ 19 октября 2010

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

Может быть, SnapsToDevicePixels=true тоже может немного помочь.

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