個別モーダルダイアログ

.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 を戻すのも忘れずに。

この個別モーダル表示では呼び出し元がグレーになってしまうが、
フォーム全面・最前面にピクチャーボックスでグレーアウト前のフォーム画像を張り付ける
手法で対応可能。