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

В .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