34847


タイトルの件、親画面としてユーザ認証画面を最初に起動し、  
認証が問題なければ、子画面としてメニュー画面を表示し、親画面であるユーザ認証画面を閉じる  
処理を検討しています。

親画面であるユーザ認証画面を閉じても、子画面であるメニュー画面をそのまま表示させたい場合、  
子画面であるメニュー画面をSystem.Diagnostics.Process.start()で別スレッドとして  
起動する方法以外に何か方法はありますでしょうか？

ご教示よろしくお願いいたします。


CC BY-SA 3.0
2017-05-19T11:42:43.317
34840
2017-05-19T21:50:44.227
9228
question
c# winforms
Windows Formで親画面から子画面を表示した後、親画面を落としても子画面を表示させたままにしたい


Windows Formではアプリケーションのシャットダウン方法を設定することはできず、必ずメインフォームが閉じられるとアプリケーションが終了します。

ですので、一般的には`Application.Run(Form)`で指定したフォームを`Close()`するのではなく`Form.Hide()`で非表示とします。この場合表示されているフォームを閉じるだけではプロセスがシャットダウンしなくなりますので、必要に応じて`FormClosed`イベントなどで`Application.Exit()`メソッドを呼び出してください。

なおこのような実装では最初に表示されるフォームのリソースが解放されなくなりますが、気になる場合は

[code]

    var form = new Form();
    form.Load += (s, e) =>
    {
        new LoginForm().Show();
        ((Form)s).Hide();
    };
    Application.Run(form);
    
[/code]

のような非表示フォームをメインフォームとすることもできます。


CC BY-SA 3.0
2017-05-19T13:41:46.970
34843
2017-05-19T13:41:46.970
5750
34840
answer


`Program.cs`の`Main()`メソッドには

[code]

    Application.Run(new Form1());
    
[/code]

のように記述されていると思います。[`Application.Run(Form)`](https://msdn.microsoft.com/ja-
jp/library/ms157902\(v=vs.110\).aspx)は引数に渡された`Form`を表示し、その`Form`が閉じられた時点で終了します。この方法では質問のようにダイアログを切り替えるには都合が悪いです。

この場合[`Application.Run(ApplicationContext)`](https://msdn.microsoft.com/ja-
jp/library/ms157901\(v=vs.110\).aspx)という別バージョンを使うとうまくいきます。こちらは[`ApplicationContext.MainForm`](https://msdn.microsoft.com/ja-
jp/library/system.windows.forms.applicationcontext.mainform\(v=vs.110\).aspx)が閉じられるまで終了されず、また`ApplicationContext.MainForm`は途中で変更可能です。ですので閉じる前にこのプロパティを書き換えればプログラムは終了しません。

イメージとしては

  * 最初は`ApplicationContext.MainForm`としてユーザ認証画面を設定しておく
  * `Application.Run(ApplicationContext)`を実行する（ユーザ認証画面が表示される）
  * 認証に成功したら 
    1. メニュー画面を表示する
    2. `ApplicationContext.MainForm`を1.のメニュー画面に書き換える
    3. ユーザ認証画面を閉じる
  * 認証に諦めたら、ユーザ認証画面を閉じる（プログラムが終了される）
  * メニュー画面が閉じられる（プログラムが終了される）

という具合でしょうか。もちろん、同様の手順でメニュー画面からユーザ認証画面に戻ることもできます。


CC BY-SA 3.0
2017-05-19T14:59:20.763
34847
2017-05-19T21:50:44.227
2017-05-19T21:50:44.227
4236
4236
34840
answer