Предотвратить перерисовку элементов управления в C #? - PullRequest
4 голосов
/ 18 июня 2010

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

Я помещаю генерирующий код в конструктор, и каждый раз при запуске приложения требуется около 3-5 секунд для полной загрузки всех элементов управления.

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

Как я могу предотвратить перерисовку элементов управления? Если вы не возражаете, приведите простой пример на C #.

Любая помощь приветствуется!

Ответы [ 4 ]

1 голос
/ 18 июня 2010

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

Он перерисовывается медленно просто потому, что у вас слишком много элементов управления. Вы можете заставить его перерисовываться быстрее, используя меньше элементов управления. Или с помощью элементов управления, которые могут отображать несколько элементов в одном окне, например ListBox, ListView, TreeView, DataGridView.

Обратите внимание, что ваша конкретная проблема устранена в Vista и Windows 7. Тема Aero использует закадровую буферизацию для окон. Это означает, что окнам больше не нужно перекрашиваться, когда они закрыты другим окном. Однако вы все равно будете получать медленную перерисовку, когда пользователь свернет окно и восстановит его.

1 голос
/ 18 июня 2010

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

Вы можете добавить обработчик к форме Paint событие, которое даст вам параметры с Graphics объектом. Используйте graphics.DrawImageUnscaled , чтобы нарисовать каждую карту в нужном месте.

Это сделает приложение намного быстрее.

1 голос
/ 18 июня 2010

Я нашел эту статью, которая объясняет, как это сделать в .NET, вызвав функцию WIN API SET_MESSAGE , чтобы установить флаг WM_SETREDRAW для элемента управления, который вы не хотите обновлять. Хотя вы можете остановить обновление некоторых элементов управления, вы уверены, что не сможете решить эту проблему, сократив количество элементов управления на странице? 100 элементов управления выглядят как много и могут указывать на то, что вам нужно иметь несколько представлений.

Наслаждайтесь!

0 голосов
/ 18 июня 2010

Возможно, вы захотите использовать один элемент управления таблицей данных.ListView (или что-то вроде ObjectListView) может быть хорошим вариантом.

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

...