DotNet でアプリケーションを開発する場合、画面遷移の主なパターンは二つあります。MDIフォームかDialogフォームです。業務内容によって、MDIと Dialogフォームが適当でない場合があります。ここでは、ウェブ ブラウザの画面遷移とよく似ている「Windows Form のブラウザ」アプリケーションの開発を紹介します。
1.画面構成
画面はメイン画面と詳細画面から成ります。※1
画面遷移時、メイン画面が常にロードされています。業務によって、詳細画面が変わります。アプリ稼動中に、メイン画面のインスタンスは一つだけあります。
※1:画面の一部だけ変わる場合、詳細画面上の任意のところで、埋め込まれるサブ画面も表示できますが、今回は割愛します。

1.1 メイン画面の構成
ヘッダー部の左の「戻る」と「HOME」ボタンは必須ですが、右は自由です。ヘッダーの下は詳細画面を入れる Panel です(PAL_Detail)。
PAL_Detail のプロパティについて、「Dock = Fill」、「BorderStyle = Fixed3D」にします。
1.2 詳細画面の構成
詳細画面のサイズはメイン画面の PAL_Detail のサイズとあわせます。プロパティについて、「StartPosition = CenterParent」、「FormBorderStyle = None」にします。画面の内容とデザインは自由です。
2.実装
メイン画面は詳細画面の遷移と画面間の通信などを管理します。PAL_Detail 内の詳細画面の切替で画面遷移を実装します。
2.1 詳細画面の表示
メイン画面は表示する詳細画面の参照を引き取って、詳細画面を PAL_Detail に入れます。
FormMain.vb
Protected Friend Sub ShowDetail(ByRef detail As FormDetail)
If detail Is Nothing Then
Return
End If
’メイン画面の表題
Me.Text = detail.Text
’詳細画面を表示する
detail.TopLevel = False
PAL_Detail.Controls.Add(detail)
detail.BringToFront()
detail.Show()
End Sub |
2.2 詳細画面を閉じる
PAL_Detail から、詳細画面を削除してから、詳細画面を閉じます。
FormMain.vb
Protected Friend Sub CloseDetail(ByRef detail As FormDetail)
If detail Is Nothing Then
Return
End If
’PAL_Detail から削除
DetailPanel.Controls.Remove(detail)
detail.Close()
’メイン画面の表題
Me.Text = PAL_Detail.Controls.Item(0).Text
End Sub |
2.3 「戻る」と「HOME」ボタン
「戻る」を押せば、現在表示している詳細画面を閉じます。「HOME」を押せば、HOME画面まで繰り返し詳細画面を閉じます。HOME画面で、「戻る」と「HOME」ボタンを押しても処理はしません。
3.画面間の通信(セッションとメッセージ)
全ての画面で共有する情報はセッションとして扱います。遷移元と遷移先だけの引数の受取は、メッセージのやり取りで実装します。
3.1 セッション
セッションはメモリで(Key, Value)のペアを持ちます。実装については、Singleton パターンのクラスを用意し、内部は Hashtable を使って簡単にできます。
3.2 メッセージ
メッセージの実装方法はセッションとよく似ています。(Key, Value)ペアの Key について、メッセージの送り先(主に遷移先フォーム)の HashCode を使えばいいです。メッセージの制御について、画面を表示する前送り元(主に遷移元フォーム)からメッセージをメッセージ列に入れて、遷移先フォームでメッセージ列からメッセージを受け取ります。画面を閉じてから、該当画面のメッセージを消します(メインフォームでできます)。
4.まとめ
画面遷移時、詳細画面だけを変えることにより、画面操作が使いやすくなります。また、各種詳細画面の表示とクローズはメイン画面で制御しますので、画面遷移とリフレッシュなどの画面共通処理を簡単に実装できます。
|