Form Lifetime in C#…
Апрель 29, 2007 — seregaborzovТо ли жизенный цикл, то ли время существования формы, то ли события, происходящие с формой. А так - Form Lifetime и надеюсь, все поняли о чем сейчас пойдет речь.
Все события и их последовательность представлены на следующем рисунке.

Рассмотрим каждое событие по подробнее:
Создание формы
Создание формы происходит с помощью вызова метода 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: windows forms lifetime
Blogus tags : csharp,программирование



