導入
実用アプリは複数の画面を持ちます。WPFでの画面遷移——別ウィンドウを開く方法と、1つのウィンドウ内でページを切り替える方法——を学び、View層で必要な知識を締めくくります。
図解
flowchart LR
subgraph 方法A["別Windowを開く"]
W1["MainWindow"] -->|新しいWindowを開く| W2["SubWindow"]
end
subgraph 方法B["Frame内でPage切替(推奨)"]
F["Frame"] --> P1["Page1"]
F --> P2["Page2"]
end
XAMLサンプル(読み物)
// 方法A: 別ウィンドウを開く(ダイアログ的な使い方)
var sub = new SubWindow();
sub.Show(); // 非モーダル(両方操作可)
// sub.ShowDialog(); // モーダル(閉じるまで元画面を操作不可)
// 方法B: 1つのFrame内でPageを切り替える(画面遷移の定番)
mainFrame.Navigate(new Page2()); // Frameの中身をPage2に差し替える
<!-- 方法B: MainWindowにFrameを置き、その中身を差し替えていく -->
<Window ...>
<Frame x:Name="mainFrame" />
</Window>
<!-- Page1.xaml(Windowではなく Page として作る) -->
<Page ...>
<Button Content="次へ" Click="GoNext" />
</Page>
- 方法A(別Window):
new Window().Show()で新しい画面を開く。ShowDialog()はモーダル(閉じるまで前の画面を操作不可) - 方法B(Frame+Page):1つのウィンドウ内で
Frameの中身をNavigateで差し替える。ウィザードや画面切り替えの定番 - MVVMでは、遷移もナビゲーションサービスをViewModelに注入して行い、Viewから遷移ロジックを分離するのが発展形
- 画面間のデータ受け渡しは、コンストラクタ引数や共有ViewModel(BlazorのDI共有と同じ考え方)で行う
詳細手順
- スターター
142-wpf-navigation/starter.zipを開く(Frame+複数Page構成) - F5で実行し、「次へ」ボタンで同じウィンドウ内の画面が切り替わることを確認する
- 「別ウィンドウを開く」ボタンで
ShowDialogのモーダル動作(閉じるまで元画面を操作できない)も確認する
まとめ
- 画面遷移は「別Windowを開く」か「Frame内でPageを切り替える」の2方式
- モーダル(
ShowDialog)は閉じるまで元画面を操作不可 - MVVMでは遷移もサービス化してViewから分離できる