Как выполнить код ПОСЛЕ загрузки формы?
В .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