Как выполнить код ПОСЛЕ загрузки формы?

В .NET в Windows Forms есть событие, которое 9X_c#-language запускается до загрузки формы (Form.Load), но 9X_c#.net нет соответствующего события, которое запускается 9X_.net-framework ПОСЛЕ загрузки формы. Я хотел бы выполнить 9X_c-sharp некоторую логику после загрузки формы.

Кто-нибудь 9X_windows-form может посоветовать решение?

151
1

  • Хотя на этот вопрос есть очень хорошие ответы, возможно, стоит упомянуть об этом: https://docs.microsoft.com/en-us/dotnet/framework/winforms/order-of- ...
8
Общее количество ответов: 8

Ответ #1

Ответ на вопрос: Как выполнить код ПОСЛЕ загрузки формы?

Вы можете использовать событие «Показано»: MSDN - Form.Shown

«Событие 9X_windows-form Shown возникает только при первом отображении 9X_.net формы; последующее сворачивание, развертывание, восстановление, скрытие, отображение 9X_.net или аннулирование и перерисовка не вызовут 9X_visual-c# это событие».

218
5

  • Мне было мало не работать на C#. Мне пришлось доб ...

Ответ #2

Ответ на вопрос: Как выполнить код ПОСЛЕ загрузки формы?

Я иногда использую (в Load)

this.BeginInvoke((MethodInvoker) delegate { // some code }); 

или

this.BeginInvoke((MethodInvoker) this.SomeMethod); 

(замените 9X_.net-framework "this" на переменную формы, если вы обрабатываете 9X_windows-form событие в экземпляре, отличном от "this").

Это 9X_dotnet помещает вызов в цикл окон-форм, поэтому 9X_events он обрабатывается, когда форма обрабатывает 9X_dot-net очередь сообщений.

[обновляется по запросу]

Методы 9X_winform Control.Invoke / Control.BeginInvoke предназначены 9X_events для использования с потоками и представляют 9X_visual-c# собой механизм для передачи работы в поток 9X_csharp пользовательского интерфейса. Обычно это 9X_c# используется рабочими потоками и т. Д. Control.Invoke 9X_c#.net выполняет синхронный вызов, тогда как Control.BeginInvoke 9X_.net выполняет асинхронный вызов.

Обычно они используются 9X_winforms как:

SomeCodeOrEventHandlerOnAWorkerThread() { // this code running on a worker thread... string newText = ExpensiveMethod(); // perhaps a DB/web call // now ask the UI thread to update itself this.Invoke((MethodInvoker) delegate { // this code runs on the UI thread! this.Text = newText; }); } 

Он делает это, помещая сообщение в очередь 9X_c# сообщений Windows; поток пользовательского 9X_c# интерфейса (в какой-то момент) удаляет сообщение 9X_c-sharp из очереди, обрабатывает делегата и сигнализирует 9X_csharp рабочему о завершении ... пока все хорошо 9X_dotnet ;-p

ОК; Итак, что произойдет, если мы используем 9X_winforms Control.Invoke / Control.BeginInvoke в потоке 9X_winforms пользовательского интерфейса? Он справляется 9X_winform ... если вы вызываете Control.Invoke, достаточно 9X_windows-forms разумно знать, что блокировка в очереди 9X_visual-c# сообщений вызовет немедленную взаимоблокировку 9X_windows-form - поэтому, если вы уже находитесь в потоке 9X_windows-forms пользовательского интерфейса, он просто 9X_.net-framework немедленно запускает код ... так что нам 9X_visual-c# не помогает ...

Но Control.BeginInvoke работает 9X_.net иначе: он всегда помещает работу в очередь, даже 9X_c#.net если мы уже находимся в потоке пользовательского 9X_windows.forms интерфейса. Это действительно простой способ 9X_c-sharp сказать «через мгновение», но без неудобств, связанных 9X_csharp с таймерами и т. Д. (Которые в любом случае 9X_.net должны будут сделать то же самое!).

53
1

  • Не совсем понял это. Не могли бы вы объяснить немн ...

Ответ #3

Ответ на вопрос: Как выполнить код ПОСЛЕ загрузки формы?

В первый раз НЕ БУДЕТ запускаться "AfterLoading",
Он 9X_dotnet просто зарегистрирует его, чтобы начать 9X_winforms СЛЕДУЮЩУЮ загрузку.

private void Main_Load(object sender, System.EventArgs e) { //Register it to Start in Load //Starting from the Next time. this.Activated += AfterLoading; } private void AfterLoading(object sender, EventArgs e) { this.Activated -= AfterLoading; //Write your code here. } 

10
0

Ответ #4

Ответ на вопрос: Как выполнить код ПОСЛЕ загрузки формы?

У меня была такая же проблема, и я решил 9X_dotnet ее следующим образом:

На самом деле я хочу 9X_c# показать сообщение и автоматически закрыть 9X_windows.forms его через 2 секунды. Для этого мне пришлось 9X_event сгенерировать (динамически) простую форму 9X_winform и одну метку, показывающую сообщение, остановить 9X_events сообщение на 1500 мс, чтобы пользователь 9X_c#.net прочитал его. И закройте динамически созданную 9X_winforms форму. Показанное событие происходит после 9X_dot-net события загрузки. Итак, код

Form MessageForm = new Form(); MessageForm.Shown += (s, e1) => { Thread t = new Thread(() => Thread.Sleep(1500)); t.Start(); t.Join(); MessageForm.Close(); }; 

5
0

Ответ #5

Ответ на вопрос: Как выполнить код ПОСЛЕ загрузки формы?

Вы также можете попробовать поместить свой 9X_event код в событие Activated формы, если хотите, чтобы 9X_csharp это произошло, как раз тогда, когда форма 9X_windows.forms активирована. Вам нужно будет ввести логическую 9X_event проверку «выполнено», если она должна запускаться 9X_dot-net только при первой активации.

3
0

Ответ #6

Ответ на вопрос: Как выполнить код ПОСЛЕ загрузки формы?

Вот некоторые детали, добавленные к предыдущим 9X_c#-language правильным ответам, особенно к ответу Матиаса 9X_events Шипплинга.

Добавьте обработчик событий в 9X_windows-form Form1_Load, например:

 private void Form1_Load(object sender, EventArgs e) { this.Shown += new EventHandler(Form1_Shown); } 

Затем добавьте метод, который 9X_event будет что-то делать с кодом

 private void Form1_Shown(Object sender, EventArgs e) { draw_on_my_form_or_some_other_action(); } 

2
0

Ответ #7

Ответ на вопрос: Как выполнить код ПОСЛЕ загрузки формы?

Это старый вопрос, и он больше зависит от 9X_c#.net того, когда вам нужно начинать работу. Поскольку 9X_c-sharp никому не нужно исключение нулевой ссылки, всегда 9X_events лучше сначала проверить наличие null, а 9X_csharp затем использовать по мере необходимости; одно 9X_event только это может спасти вас от горя.

Наиболее 9X_c#-language распространенная причина вопросов этого 9X_csharp типа - когда контейнер или тип настраиваемого 9X_.net элемента управления пытается получить доступ 9X_c# к свойствам, инициализированным за пределами 9X_csharp настраиваемого класса, где эти свойства 9X_c# еще не инициализированы, что потенциально 9X_winform может привести к заполнению значений NULL 9X_winform и даже к исключения нулевых ссылок для типов 9X_c-sharp объектов. Это означает, что ваш класс запущен 9X_visual-c# до того, как он будет полностью инициализирован 9X_visual-c# - до того, как вы закончите настройку своих 9X_dot-net свойств и т. Д. Другой возможной причиной 9X_c#.net этого типа вопросов является то, когда выполнять 9X_csharp настраиваемую графику.

Чтобы лучше всего 9X_windows-forms ответить на вопрос о том, когда начинать 9X_c#.net выполнение кода после события загрузки формы, нужно 9X_visual-c# отслеживать сообщение WM_Paint или подключаться 9X_c# непосредственно к самому событию рисования. Почему? Событие 9X_.net рисования срабатывает только тогда, когда 9X_winforms все модули полностью загружены относительно 9X_event события загрузки формы. Примечание. This.visible 9X_windows.forms == true не всегда является истинным, если 9X_dot-net для него установлено значение true, поэтому 9X_c# он вообще не используется для этой цели, кроме 9X_csharp как для скрытия формы.

Ниже приведен полный 9X_c#.net пример того, как начать выполнение кода 9X_.net после события загрузки формы. Рекомендуется 9X_csharp без надобности не связывать цикл сообщений 9X_windows-form рисования, поэтому мы создадим событие, которое 9X_winforms начнет выполнение вашего кода за пределами 9X_winform этого цикла.

using System.Windows.Forms; 

пространство имен MyProgramStartingPlaceExample {

/// 
/// Main UI form object ///
 public class Form1 : Form { /// 
/// Main form load event handler ///
 public Form1() { // Initialize ONLY. Setup your controls and form parameters here. Custom controls should wait for "FormReady" before starting up too. this.Text = "My Program title before form loaded"; // Size need to see text. lol this.Width = 420; // Setup the sub or fucntion that will handle your "start up" routine this.StartUpEvent += StartUPRoutine; // Optional: Custom control simulation startup sequence: // Define your class or control in variable. ie. var MyControlClass new CustomControl; // Setup your parameters only. ie. CustomControl.size = new size(420, 966); Do not validate during initialization wait until "FormReady" is set to avoid possible null values etc. // Inside your control or class have a property and assign it as bool FormReady - do not validate anything until it is true and you'll be good! } /// 
/// The main entry point for the application which sets security permissions when set. ///
 static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form1()); } #region "WM_Paint event hooking with StartUpEvent" // // Create a delegate for our "StartUpEvent" public delegate void StartUpHandler(); // // Create our event handle "StartUpEvent" public event StartUpHandler StartUpEvent; // // Our FormReady will only be set once just he way we intendded // Since it is a global variable we can poll it else where as well to determine if we should begin code execution !! bool FormReady; // // The WM_Paint message handler: Used mostly to paint nice things to controls and screen protected override void OnPaint(PaintEventArgs e) { // Check if Form is ready for our code ? if (FormReady == false) // Place a break point here to see the initialized version of the title on the form window { // We only want this to occur once for our purpose here. FormReady = true; // // Fire the start up event which then will call our "StartUPRoutine" below. StartUpEvent(); } // // Always call base methods unless overriding the entire fucntion base.OnPaint(e); } #endregion #region "Your StartUp event Entry point" // // Begin executuing your code here to validate properties etc. and to run your program. Enjoy! // Entry point is just following the very first WM_Paint message - an ideal starting place following form load void StartUPRoutine() { // Replace the initialized text with the following this.Text = "Your Code has executed after the form's load event"; // // Anyway this is the momment when the form is fully loaded and ready to go - you can also use these methods for your classes to synchronize excecution using easy modifications yet here is a good starting point. // Option: Set FormReady to your controls manulaly ie. CustomControl.FormReady = true; or subscribe to the StartUpEvent event inside your class and use that as your entry point for validating and unleashing its code. // // Many options: The rest is up to you! } #endregion } 

}

1
0

Ответ #8

Ответ на вопрос: Как выполнить код ПОСЛЕ загрузки формы?

Я знаю, что это старый пост. Но вот как 9X_windows-forms я это сделал:

 public Form1(string myFile) { InitializeComponent(); this.Show(); if (myFile != null) { OpenFile(myFile); } } private void OpenFile(string myFile = null) { MessageBox.Show(myFile); } 

1
0