Form Lifetime in C#…

То ли жизенный цикл, то ли время существования формы, то ли события, происходящие с формой. А так - Form Lifetime и надеюсь, все поняли о чем сейчас пойдет речь.

Все события и их последовательность представлены на следующем рисунке.

formlife
Рассмотрим каждое событие по подробнее:

Создание формы

Создание формы происходит с помощью вызова метода InitializeComponent(), описанного в Form1.Designer.cs, после того как в главной программе мы создали новый экземпляр класса Form: Application.Run(new Form1()). При этом в методе InitializeComponent() не рекомендуется что-либо изменять, поскольку можно потерять “всё что должно построиться”. При этом следующий код тоже возможен:

 

public Form1() {

   InitializeComponent();
// Добавим кнопку

   Button myButton = new Button();

   this.Controls.Add(myButton);
// Изменим имя формы на текущее время

   this.Text = DateTime.Now.ToString();

}

Непосредственно после первого вызова метода Form.Show() или Form.ShowDialog(), наступает событие Load, которое генерируется один раз.

 

// Form1.cs

partial class Form1 : Form {

  ...

  void Form1_Load(object sender, EventArgs e) {

    MessageBox.Show('Loading Form1!');

  }

}
// Form1.Designer.cs

partial class Form1 {

  ...

  void InitializeComponent() {

    ...

    this.Load += this.Form1_Load;

    ...

  }

Это событие можно использовать для первоначальной инициализации переменных и для подготовки формы к работе. Сколько в приложении форм, столько раз будет генерироваться это событие. Назначение максимальных и минимальных размеров формы – для этого более подходящего места, нежели обработчик события OnLoad не найти.

Далее следует событие Activated, которое многократно генерируется в течение жизни формы. Связано с получением и потерей фокуса. Методы Form.Show(), Form.ShowDialog(), Form.Activate() (передача фокуса, реализованная программно!) способствуют этому:

 

// Form1.cs

partial class Form1 : Form {

  ...

  void Form1_Shown(object sender, EventArgs e) {

      this.label1.Text = "Form1 activated!";

  }

}
// Form1.Designer.cs

partial class Form1 {

  ...

  void InitializeComponent() {

    ...

    this.Shown += this.Form1_Shown;

    ...

  }

}

Активация и деактивация

Если в предыдущем примере мы обрабатывали событие происходящие при “фокусировке” формы, то для обратного события существует Deactivate:

 

private void Form1_Deactivate(object sender, EventArgs e)

        {

            this.label1.Text = "Form1 deactivated!";

        }

Так же существует метод Hide(), скрывающий форму. Но на самом деле он просто устанавливает Visible в фолз:

 

void hideButton_Click(object sender, EventArgs e) {

  this.Hide(); // Set Visible property indirectly

  this.Visible = false; // Set Visible property directly

}

Уничтожение формы

После использования приложения пользователь закрывает окно. Это может происходить несколькими способами:

 

void Form1_FormClosing(object sender, FormClosingEventArgs e) {

  DialogResult result = MessageBox.Show(

    "Abort your app?", "App In Progress", MessageBoxButtons.YesNo);

  e.Cancel = (result == DialogResult.No);

}

Или:

 

void Form1_FormClosed(object sender, FormClosedEventArgs e) {

  MessageBox.Show("Your  was aborted");

}

Closing наступает непосредственно перед закрытием формы. В этот момент процесс закрытия формы может быть приостановлен и вообще отменён, чему способствует размещаемый в теле обработчика события следующий программный код: e.Cancel = (result == DialogResult.No)
Closed происходит после закрытия формы. Назад пути нет. В обработчике этого события размещается любой код для “очистки” (освобождения ресурсов) после закрытия формы.

Для обработки всех путей закрытия формы можно создать перечисление:

 

enum CloseReason {

   None, // No reason given, or could not be determined

   WindowsShutDown, // Windows is closing (ShutDown or Logoff)

   MdiFormClosing, // MDI parent form is closing

   UserClosing, // User closed (close box or Alt+F4)

   TaskManagerClosing, // Task Manager | End Task

   FormOwnerClosing, // Owner form is closing

   ApplicationExitCall // Application.Exit invoked

}

И использовать его:

 

void Form1_FormClosed(object sender, FormClosedEventArgs e) {

  MessageBox.Show(

    "Your game was aborted: " + e.CloseReason.ToString());

}

…а музыка была: Jennifer Lopez - If You Had My Love

Tags:

Blogus tags : ,

Опубликовано в CSharp.

Ответить