Производительность приложений Windows Forms - PullRequest
4 голосов
/ 05 сентября 2008

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

Хотя я использую вкладки для ограничения количества отображаемых элементов управления и двойную буферизацию, он все равно мерцает и заикается, когда ему нужно перерисовать (изменить размер, развернуть и т. Д.).

Какие советы и рекомендации помогут вам повысить производительность приложения WinForms?

Ответы [ 4 ]

4 голосов
/ 05 сентября 2008

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

  1. Вы получите более высокую производительность, если будете использовать абсолютное позиционирование для каждого элемента управления (myNewlyCreatedButton.Location.X / Y) в отличие от использования панели макета потока или панели макета таблицы. WinForms должен выполнять намного меньше математических операций, пытаясь выяснить, где следует разместить элементы управления.

  2. Если есть одна операция, в которой вы добавляете / удаляете / модифицируете много элементов управления, вызовите «SuspendLayout ()» для контейнера задействованных элементов управления (будь то панель или вся форма ), и когда вы закончите свою работу, вызовите «ResumeLayout ()» на той же панели. Если вы этого не сделаете, форма должна будет проходить макет каждый раз, когда вы добавляете / удаляете / изменяете элемент управления, что стоит намного больше времени. см .: http://msdn.microsoft.com/en-us/library/system.windows.forms.control.suspendlayout(VS.80).aspx

Хотя я не уверен, как эти подходы могут применяться при изменении размера окна.

3 голосов
/ 05 сентября 2008

Хотя более общий, чем некоторые другие советы, вот мой:

При использовании большого количества «элементов» старайтесь избегать создания элемента управления для каждого из них, а скорее используйте элементы управления повторно. Например, если у вас есть 10 000 элементов, каждый из которых соответствует кнопке, очень легко (программно) создать 10 000 кнопок и подключить их обработчики событий, чтобы при вводе в обработчик событий вы точно знали, какой элемент ты должен работать над Однако гораздо эффективнее, если вы создадите, скажем, 500 кнопок (потому что вы знаете, что только 500 кнопок будут видны на экране в любое время) и введете «слой отображения» между кнопками и элементами, который динамически переназначает кнопки различным элементам каждый раз, когда пользователь делает что-то, что может привести к изменению набора кнопок, которые должны быть видны (например, перемещение полосы прокрутки).

2 голосов
/ 05 сентября 2008

Хотя я не уверен, как эти подходы могут применяться при изменении размера окна.

Обработайте события ResizeBegin и ResizeEnd для вызова SuspendLayout () и ResumeLayout (). Эти события есть только в классе System.Windows.Form (хотя хотелось бы, чтобы они также были в Control).

1 голос
/ 05 сентября 2008

Вы хорошо используете SuspendLayout() и ResumeLayout()?

http://msdn.microsoft.com/en-us/library/system.windows.forms.control.suspendlayout(VS.80).aspx

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