Как выполнить код ПОСЛЕ загрузки формы?
В .NET в Windows Forms есть событие, которое 9X_c#-language запускается до загрузки формы (Form.Load), но 9X_c#.net нет соответствующего события, которое запускается 9X_.net-framework ПОСЛЕ загрузки формы. Я хотел бы выполнить 9X_c-sharp некоторую логику после загрузки формы.
Кто-нибудь 9X_windows-form может посоветовать решение?
- Хотя на этот вопрос есть очень хорошие ответы, возможно, стоит упомянуть об этом: https://docs.microsoft.com/en-us/dotnet/framework/winforms/order-of- ...
Ответ #1
Ответ на вопрос: Как выполнить код ПОСЛЕ загрузки формы?
Вы можете использовать событие «Показано»: MSDN - Form.Shown
«Событие 9X_windows-form Shown возникает только при первом отображении 9X_.net формы; последующее сворачивание, развертывание, восстановление, скрытие, отображение 9X_.net или аннулирование и перерисовка не вызовут 9X_visual-c# это событие».
- Мне было мало не работать на 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 должны будут сделать то же самое!).
- Не совсем понял это. Не могли бы вы объяснить немн ...
Ответ #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. }
Ответ #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
Ответ на вопрос: Как выполнить код ПОСЛЕ загрузки формы?
Вы также можете попробовать поместить свой 9X_event код в событие Activated формы, если хотите, чтобы 9X_csharp это произошло, как раз тогда, когда форма 9X_windows.forms активирована. Вам нужно будет ввести логическую 9X_event проверку «выполнено», если она должна запускаться 9X_dot-net только при первой активации.
Ответ #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(); }
Ответ #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 }
}
Ответ #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); }
-
13
-
11
-
7
-
5
-
4
-
3
-
4
-
3
-
5
-
3
-
3
-
2
-
10
-
2
-
5
-
5
-
4
-
3
-
2
-
4
-
6
-
2
-
4
-
3
-
1
-
1
-
8
-
4
-
2
-
4
-
9
-
4
-
13
-
7
-
5
-
3
-
3
-
2
-
10
-
3
-
4
-
5
-
6
-
4
-
4
-
7
-
4
-
4
-
4
-
4