C#の WPF Prism でナビゲート画面の遷移方法について説明します。
下記のように、ボタンを押すと画面が切り替わる処理です。 (ダイアログではなく、画面内の表示が切り替わります。)
対象ファイル(例)
コーディングが必要なファイルは下記の A~C です。
Views/
|-MainWindowView.xaml(画面遷移元) ・・・A
|-SampleNavigationView.xaml(画面遷移先)
ViewModels/
|-MainWindowViewModel.cs(画面遷移元) ・・・B
|-SampleNavigationViewModel.cs(画面遷移先) ・・・C
App.xaml.cs ・・・D
MainWindowView.xaml(画面遷移元) ・・・A
①ボタンにCommandを追加
画面遷移元のViewのボタンに対して、CommandにBindingでデリゲートコマンド名称を記載します。
<Button Content="Sampleナビゲーション画面"
FontSize="14"
Margin="10"
Padding="5"
Command="{Binding SampleNavigationViewButton}"/>
MainWindowViewModel.cs(画面遷移元) ・・・B
②ViewModelにIRegionManagerの変数を追加
画面遷移元のViewModelに、IRegionManagerのプライベート変数を追加し、コンストラクタでセットします。
③ボタン押下時の実行メソッドを追加
ボタン押下イベントを受け取るデリゲートコマンドのプロパティを追加し、ボタン押下時のExcuteメソッドを実装します。
▼上記②~③のサンプルコード
private IRegionManager _regionManager; //// 画面遷移(ナビゲーション)
//// コンストラクタ
public MainWindowViewModel(IRegionManager regionManager)
{
//// 画面遷移用(ナビゲーション)
_regionManager = regionManager;
SampleNavigationViewButton = new DelegateCommand(SampleNavigationViewButtonExecute);
}
public DelegateCommand SampleNavigationViewButton { get; }
private void SampleNavigationViewButtonExecute()
{
//// 画面遷移処理(ナビゲーション)
_regionManager.RequestNavigate("ContentRegion", nameof(SampleNavigationView));
}
SampleNavigationViewModel.cs(画面遷移先) ・・・C
④INavigationAwareインターフェースを実装
画面遷移先のViewModelに、INavigationAwareインターフェース と IRegionMemberLifetimeインターフェースを実装します。
※2023/3/5 追記 ViewModelインスタンスのメモリ開放のため、IRegionMemberLifetimeインターフェース実装を追加しました。
⑤インターフェースのメソッドを変更
INavigationAwareを実装した事で追加される IsNavigationTarget の 戻り値を true とし、KeepAlive を false にして下さい。そうすれば、画面破棄でメモリが開放されます。
▼上記④~⑤のサンプルコード
public class SampleTableEditViewModel : BindableBase, INavigationAware, IRegionMemberLifetime
{
/// <summary>
/// ViewModel破棄に伴いメモリ開放する際はfalse
/// </summary>
public bool KeepAlive { get; set; } = false;
//// 各種処理
public bool IsNavigationTarget(NavigationContext navigationContext)
{
//// RegionMemberLifetime(KeepAlive = false)でViewModelを破棄するため、こちらはTrue
return true;
}
public virtual void OnNavigatedFrom(NavigationContext navigationContext)
{
}
public virtual void OnNavigatedTo(NavigationContext navigationContext)
{
}
}
App.xaml.cs ・・・D
⑥RegisterTypes内でViewを登録
protected override void RegisterTypes(IContainerRegistry containerRegistry)
{
//// ナビゲーション画面
containerRegistry.RegisterForNavigation<SampleNavigationView>();
}
containerRegistry.RegisterForNavigationに設定したViewが画面遷移可能となります。