Отзывчивый запуск с приложением Winforms - PullRequest
1 голос
/ 15 ноября 2011

У меня визуально сложное приложение с множеством компонентов пользовательского интерфейса и сторонних элементов управления.При запуске он мгновенно переходит в режим подзарядки, так как все изменяется и загружается в Form_Load (но в основном из-за изменения размера).

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

Как я могу убедиться, что форма отображается, когда все готово и изменено в размере.

Ответы [ 3 ]

4 голосов
/ 15 ноября 2011

Событие Load выполняется в потоке пользовательского интерфейса.Вы никогда не должны помещать логическую обработку в поток пользовательского интерфейса, так как блокирование делает пользовательский интерфейс невосприимчивым.

Вы должны создать новый поток (см. Класс Thread) и выполнить логику запускатам.Экран загрузки может быть в порядке, если он занимает более 3 секунд.Вам нужно будет использовать Form.Invoke() и делегатов для выполнения любой логики, которая взаимодействует с потоком пользовательского интерфейса (например, изменение текста TextBox).

Вы также ошибаетесь, предполагая, что происходит событие Loadкогда форма отображается.Событие Load наступает после инициализации компонента и перед отображением формы, тогда событие Shown возникает при отображении формы.

2 голосов
/ 15 ноября 2011

Ваше предположение не совсем верно: Form_Load (или, если быть точным: загрузка обработчиков событий) выполняется, когда форма отображается в первый раз.Это правда, что на данный момент ваша форма уже видна, хотя и не используется, так как ваш поток заблокирован вашей функцией FormLoad.

У вас есть несколько вариантов:

  1. Использовать заставкуЭкран, который не имеет элементов управления и верхней панели, так как он не имеет ввода, не будет видно, что ваша нить заблокирована.
  2. Подготовьте ваши размеры и расположение перед показом формы.Это совершенно законно, чтобы установить размеры и позиции, прежде чем вызвать шоу.Например, в конструкторе вашей формы.
  3. Измените логику, чтобы длинные вычисления отсутствовали в потоке пользовательского интерфейса.Потоки просты с ThreadPool и затем Form.Invoke , вызывая методы в вашей форме.
2 голосов
/ 15 ноября 2011

Это похоже на этот вопрос SO с принятым ответом: Одиночная форма Скрыть при запуске

Эта ссылка MSDN, связанная с повышением производительности оконных форм, также может вам сильно помочь: http://msdn.microsoft.com/en-us/magazine/cc163630.aspx

...