一般に、アプリケーションにデフォルト以外のことを実行させる正しい方法(フォームを開き、フォームが閉じるのを待ってから終了する)は、から継承するクラスを作成することApplicationContext
です。次に、クラスのインスタンスをApplication.Run
メソッドに渡します。アプリケーションを閉じる必要がある場合はExitThread()
、クラス内から呼び出します。
この場合、アプリケーションのロード時に3つのフォームのインスタンスを作成し、それらのClosed
イベントのハンドラーを登録できます。各フォームを閉じると、ハンドラーはまだ開いている他のフォームがあるかどうかを確認し、ない場合はアプリケーションを閉じます。
MSDNの例では、次の2つのことを行っています。
- 複数のフォームを開き、すべて閉じたらアプリケーションを終了します
- 各フォームを閉じるときに、フォームの最後のサイズと位置を保存します。
すべてのフォームが閉じられた後にのみアプリケーションを閉じる、より簡単な例:
class MyApplicationContext : ApplicationContext {
private void onFormClosed(object sender, EventArgs e) {
if (Application.OpenForms.Count == 0) {
ExitThread();
}
}
public MyApplicationContext() {
//If WinForms exposed a global event that fires whenever a new Form is created,
//we could use that event to register for the form's `FormClosed` event.
//Without such a global event, we have to register each Form when it is created
//This means that any forms created outside of the ApplicationContext will not prevent the
//application close.
var forms = new List<Form>() {
new Form1(),
new Form2(),
new Form3()
};
foreach (var form in forms) {
form.FormClosed += onFormClosed;
}
//to show all the forms on start
//can be included in the previous foreach
foreach (var form in forms) {
form.Show();
}
//to show only the first form on start
//forms[0].Show();
}
}
次に、Program
クラスは次のようになります。
static class Program {
[STAThread]
static void Main() {
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new MyApplicationContext());
}
}
アプリケーションを閉じるロジックは、明らかにカスタマイズできます。フォームはまだ開いているか、これら3つのタイプの1つだけ、または最初の3つのインスタンスのみです(最初の3つのインスタンスへの参照を保持する必要がありますList<Form>
)。
Re:フォーム作成ごとのグローバルイベント-これは有望に見えます。
ここに同様の例があります。