個別モーダルダイアログ
.NET Framework Windows Forms (VB/C#)
個別モーダルダイアログ
以下のようなマルチウィンドウな画面構成の Windows Forms Application があるとする。
MainForm(あるいは ApplicationContext 制御)
├─ Form1
├─ Form2
└─ Form3
Form1, 2, 3 は平行操作可能。(同じクラスのインスタンスでも、異なるフォームでも構わない。)
Form1, 2, 3 いずれから標準のメッセージボックスや独自モーダルダイアログを表示すると、
それを閉じるまでアプリケーションモーダルとして全てのウィンドウの操作が抑止される。
平行操作も出来なくなる。
Form1, 2, 3 (インスタンス) ごとにモーダルダイアログを表示する方法がある。
Form4 をモーダルダイアログ用フォームとして作成、
Form1, 2, 3 から ShowDialog( ) ではなく Show(Me) / Show(this) で表示、
呼び出し元フォームの Enabled を False にする。
これで Form4 がモーダルの動作になるが、呼び出し元以外のインスタンスは阻害しない。
なお、MainForm(ApplicationContext)を終了すると、個別モーダル表示中でも閉じられる。
※Show( ) なので呼び出し元のコードはブロックされず続行される。
ダイアログ側 FormClosed イベントから呼び出し元の後処理に連携するとか。
呼び出し元 Enabled を戻すのも忘れずに。
この個別モーダル表示では呼び出し元がグレーになってしまうが、
フォーム全面・最前面にピクチャーボックスでグレーアウト前のフォーム画像を張り付ける
手法で対応可能。