C# | WPF Prism 画面遷移(ナビゲート)
C# WPF Prism ナビゲート画面の遷移方法
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が画面遷移可能となります。
関連コンテンツ
技術の記事をもっと見る →C# | WPF Prism 部分ViewからMainWindowのメソッドを呼び出す方法
WPF Prismでは、部分ViewからMain Windowのメソッドを呼び出すことができます。PrismのイベントAggregatorを使用することで、ViewModel間の直接的な参照を回避し、アプリケーション内で発生するイベントを簡単に処理することができます。
#csharp#wpf#prismC# | WPF Prism MainWindow から ContentRegion の View メソッドを呼び出す方法
WPF Prismでは、主要なウィンドウ(Main Window)とその中に含まれる一連のリージョン(Region)で構成される場合があります。これらのリージョンには、ビュー(View)やビューモデル(ViewModel)が配置され、相互に通信することができます。Main WindowからContent Regionにあるビューやビューモデルのメソッドを呼び出す方法を説明します。
#csharp#wpf#prismC# | WPF Prism 動画(MediaElement)をMVVMパターンで実装する方法
WPF Prism の動画再生(MediaElement.Play())を、MVVM パターンで実装する方法
#csharp#wpf#prism