В .NET у Windows Forms есть событие, которое запускается до загрузки формы (Form.Load), но нет соответствующего события, которое запускается ПОСЛЕ загрузки формы. Я хотел бы выполнить некоторую логику после загрузки формы.
Кто-нибудь может посоветовать решение?
Ответы:
Вы можете использовать событие «Показано»: MSDN - Form.Shown
«Событие Shown возникает только при первом отображении формы; впоследствии сворачивание, развертывание, восстановление, скрытие, отображение или аннулирование и перерисовка не вызовут это событие».
источник
Shown += Form1_Shown;
как было предложено в другой веткеИногда использую (в нагрузке)
или
(замените "this" на свою переменную формы, если вы обрабатываете событие в экземпляре, отличном от "this").
Это помещает вызов в цикл окон-форм, поэтому он обрабатывается, когда форма обрабатывает очередь сообщений.
[обновлено по запросу]
Методы Control.Invoke / Control.BeginInvoke предназначены для использования с потоками и являются механизмом для передачи работы в поток пользовательского интерфейса. Обычно это используется рабочими потоками и т. Д. Control.Invoke выполняет синхронный вызов, тогда как Control.BeginInvoke выполняет асинхронный вызов.
Обычно они используются как:
Он делает это, помещая сообщение в очередь сообщений Windows; поток пользовательского интерфейса (в какой-то момент) удаляет сообщение из очереди, обрабатывает делегата и сигнализирует рабочему о завершении ... пока все хорошо ;-p
ХОРОШО; Итак, что произойдет, если мы используем Control.Invoke / Control.BeginInvoke в потоке пользовательского интерфейса? Он справляется ... если вы вызываете Control.Invoke, достаточно разумно знать, что блокировка очереди сообщений вызовет немедленную взаимоблокировку - поэтому, если вы уже находитесь в потоке пользовательского интерфейса, он просто немедленно запускает код ... так что нам не помогает ...
Но Control.BeginInvoke работает иначе: он всегда помещает работу в очередь, даже если мы уже находимся в потоке пользовательского интерфейса. Это действительно простой способ сказать «через мгновение», но без неудобств, связанных с таймерами и т. Д. (Которые в любом случае должны будут сделать то же самое!).
источник
В первый раз он НЕ БУДЕТ запускать «AfterLoading»,
он просто зарегистрирует его для запуска СЛЕДУЮЩЕЙ загрузки.
источник
У меня была такая же проблема, и я решил ее следующим образом:
На самом деле я хочу показать сообщение и автоматически закрыть его через 2 секунды. Для этого мне пришлось сгенерировать (динамически) простую форму и одну метку, показывающую сообщение, остановить сообщение на 1500 мс, чтобы пользователь прочитал его. И закройте динамически созданную форму. Показанное событие происходит после события загрузки. Итак, код
источник
Вы также можете попробовать поместить свой код в событие Activated формы, если хотите, чтобы это произошло, как раз тогда, когда форма активирована. Вам нужно будет ввести логическую проверку «выполнено», если она должна запускаться только при первой активации.
источник
Это старый вопрос, и он больше зависит от того, когда вам нужно начинать рутину. Поскольку никому не нужно исключение нулевой ссылки, всегда лучше сначала проверить наличие null, а затем использовать по мере необходимости; одно это может избавить вас от многих неприятностей.
Наиболее распространенная причина этого типа вопросов - когда контейнер или тип настраиваемого элемента управления пытается получить доступ к свойствам, инициализированным за пределами настраиваемого класса, где эти свойства еще не инициализированы, что потенциально может привести к заполнению нулевых значений и даже может вызвать исключения из нулевой ссылки по типам объектов. Это означает, что ваш класс запущен до того, как он будет полностью инициализирован - до того, как вы закончите настройку своих свойств и т. Д. Другая возможная причина такого типа вопросов - когда выполнять пользовательскую графику.
Чтобы лучше всего ответить на вопрос о том, когда начинать выполнение кода после события загрузки формы, нужно отслеживать сообщение WM_Paint или подключаться непосредственно к самому событию рисования. Зачем? Событие рисования срабатывает только тогда, когда все модули полностью загружены относительно события загрузки формы. Примечание. This.visible == true не всегда является истинным, если для него установлено значение true, поэтому он вообще не используется для этой цели, кроме как для скрытия формы.
Ниже приведен полный пример того, как начать выполнение кода после события загрузки формы. Рекомендуется без надобности не связывать цикл сообщений рисования, поэтому мы создадим событие, которое начнет выполнение вашего кода вне этого цикла.
пространство имен MyProgramStartingPlaceExample {
}
источник
Я знаю, что это старый пост. Но вот как я это сделал:
источник
Вы можете закрыть свою форму после некоторого выполнения ..
//YourForm.ActiveForm.Close ();
источник