一、注冊導航
1、注冊視圖或起別名
public class ModuleAProfile : IModule
{
public void OnInitialized(IContainerProvider containerProvider)
{
}
public void RegisterTypes(IContainerRegistry containerRegistry)
{
containerRegistry.RegisterForNavigation<ViewA>();
//注冊時指定ViewMode
//containerRegistry.RegisterForNavigation<ViewA>("ViewAVM");
}
}
2、注冊時指定ViewMode並指定別名
public class ModuleAProfile : IModule
{
public void OnInitialized(IContainerProvider containerProvider)
{
}
public void RegisterTypes(IContainerRegistry containerRegistry)
{
containerRegistry.RegisterForNavigation<ViewA,ViewAViewModel>();
//注冊時指定ViewMode並指定別名
//containerRegistry.RegisterForNavigation<ViewA, ViewAViewModel>("ViewAVM");
}
}
二、使用導航
IRegionManager regionManager = …;
regionManager.RequestNavigate("RegionName", "ViewName");
可以注意點, 我們調用了IRegionManager接口的RequestNavigate方法, 並且傳遞了兩個參數:
- RegionName: 該參數為注冊的區域名稱
- ViewName: 該參數實際為我們上面注冊過的導航頁, 字符串類型, 對應的是我們注冊頁面的nameof
三、帶參數導航
1、通過F12查看RequestNavigate,可以發現可以傳遞一個NavigationParameters進去,它是一個鍵值對的集合
NavigationParameters pairs = new NavigationParameters();
pairs.Add("Keys1", "Hello Prism!");
_regionManage.Regions["ModuleContent"].RequestNavigate(obj,pairs);
2、接着在VM中繼承INavigationAware並實現
3、在OnNavigatedTo方法中NavigationContext獲取到所傳遞的參數,通過屬性保存並綁定到視圖中
public void OnNavigatedTo(NavigationContext navigationContext)
{
if (navigationContext.Parameters.ContainsKey("Keys1"))
{
Content = navigationContext.Parameters.GetValue<string>("Keys1");
}
}
- OnNavigatedTo: 導航完成前, 此處可以傳遞過來的參數以及是否允許導航等動作的控制。
- IsNavigationTarget: 調用以確定此實例是否可以處理導航請求。否則新建實例
- OnNavigatedFrom: 用於攔截導航,當導航離開當前頁時, 類似打開A, 再打開B時, 該方法被觸發。
INavigationAware 執行流程
攔截導航請求如果需要更多的功能則可以繼承IConfirmNavigationRequest,通過F12發現它派生於INavigationAware,並且有一個自己獨有的方法ConfirmNavigationRequest
public void ConfirmNavigationRequest(NavigationContext navigationContext, Action<bool> continuationCallback)
{
bool result = true;
if (MessageBox.Show("確認是否要離開當前模塊?","系統提示",MessageBoxButton.YesNo)==MessageBoxResult.No)
{
result = false;
}
continuationCallback(result);
}
效果:
四、上一步/下一步
1、F12查看RequestNavigate,重載方法中有一個參數為Action
我們稍微改一下
2、聲明一個IRegionNavigationJournal
private IRegionNavigationJournal journal;
3、在RequestNavigate中加一個Callback參數,獲取返回結果,通過這個navigationCallback的上下文中的導航服務獲取到Journal並賦值給剛聲明的IRegionNavigationJournal
regionManage.Regions["ModuleContent"].RequestNavigate(obj, navigationCallback =>
{
if ((bool)navigationCallback.Result)
{
journal = navigationCallback.Context.NavigationService.Journal;
}
}, pairs);
4、創建兩個用於導航的按鈕命令
public DelegateCommand BackCommand { get; private set; }
public DelegateCommand NextCommand { get; private set; }
public MainWindowViewModel(IRegionManager regionManager)
{
_regionManage = regionManager;
OpenCommand = new DelegateCommand<string>(OpenMethod);
BackCommand = new DelegateCommand(Back);
NextCommand = new DelegateCommand(Next);
}
5、通過Journal即可調用導航
private void Back()
{
if (journal.CanGoBack)
{
journal.GoBack();
}
}
效果: