導航
視頻教程地址
上一章回顧
- Prism框架與其它框架的區別
- Prism當中的Binding用法
- Command和CompositeCommand 用法
- IEventAggregator 以及Filtering Events 用法
本章節將講解Prism當中的Navigation導航功能
使用場景
在普遍的業務場景當中, 必不可少的是頁面切換, 而Prism就可以使用Navigation功能來進行頁面導航, 在不同的場景當中會有各種用法, 例如在切換頁面驗證、傳遞參數、返回上一頁、返回下一頁等功能。
導航的基本條件
- 1.注冊顯示區域
點擊此處觀看視頻,關於區域的介紹 - 2.注冊導航頁面
1.注冊導航
- 注冊視圖類型或添加別名, 如果為指定別名,名稱默認為當中類型的名稱
public class ModuleAModule : IModule
{
public void OnInitialized(IContainerProvider containerProvider)
{
}
public void RegisterTypes(IContainerRegistry containerRegistry)
{
//添加別名 "CustomName"
containerRegistry.RegisterForNavigation<ViewA>("CustomName");
//默認名稱 "ViewB"
containerRegistry.RegisterForNavigation<ViewB>();
}
}
- 注冊時,指定ViewModel或添加別名。
public class ModuleAModule : IModule
{
public void OnInitialized(IContainerProvider containerProvider)
{
}
public void RegisterTypes(IContainerRegistry containerRegistry)
{
//指定ViewModel
containerRegistry.RegisterForNavigation<ViewA, ViewAViewModel>();
//指定ViewModel並且添加別名
containerRegistry.RegisterForNavigation<ViewB, ViewBViewModel>("CustomName");
}
}
2.使用導航
正如前面的章節所講到, Region的注冊以及管理、導航等, 我們可以使用IRegionManager接口,所以,我們現在便可以使用該接口實現導航功能, 如下所示:
IRegionManager regionManager = …;
regionManager.RequestNavigate("RegionName", "ViewName");
可以注意點, 我們調用了IRegionManager接口的RequestNavigate方法, 並且傳遞了兩個參數:
- RegionName: 該參數為注冊的區域名稱
- ViewName: 該參數實際為我們上面注冊過的導航頁, 字符串類型, 對應的是我們注冊頁面的nameof
3.帶參數導航
正如,我們想要在導航頁前, 傳遞一些參數, 則可以使用NavigationParameters, 如下所示:
var param = new NavigationParameters();
param.Add("Parameter", param);
_regionManger.RequestNavigate("RegionName", "ViewName", param);
//類似URL地址傳遞參數
_regionManger.RequestNavigate("RegionName", "ViewName?id=1&Name=xiaoming");
疑問?
當我們使用導航為指定區域注冊視圖時, 我們怎么控制打開的過程? 所以, 下面我們將講解一下
INavigationAware接口。
INavigationAware
該接口包含3個方法, 每個方法中都包含當前導航的上下文, 如下所示:
public void OnNavigatedTo(NavigationContext navigationContext)
{
}
public bool IsNavigationTarget(NavigationContext navigationContext)
{
return true;
}
public void OnNavigatedFrom(NavigationContext navigationContext)
{
}
- OnNavigatedTo: 導航完成前, 此處可以傳遞過來的參數以及是否允許導航等動作的控制。
- IsNavigationTarget: 調用以確定此實例是否可以處理導航請求。否則新建實例
- OnNavigatedFrom: 當導航離開當前頁時, 類似打開A, 再打開B時, 該方法被觸發。
INavigationAware 執行流程
獲取導航請求參數
正如上面所描述, 導航中允許我們傳遞參數, 用於在我們完成導航之前, 進行做對應的邏輯業務處理。這時候, 我們便可以在OnNavigatedTo方法中通過導航上下文中獲取到傳遞的所有參數。如下:
public void OnNavigatedTo(NavigationContext navigationContext)
{
var id = navigationContext.Parameters.GetValue<int>("id");
var name = navigationContext.Parameters["Name"].ToString();
}
IConfirmNavigationRequest
該接口繼承於INavigationAware, 所以, 它多了一個功能: 允許用戶針對導航請求進行攔截。
//多了一個回調函數, 該值覺得是否攔截該導航請求
void ConfirmNavigationRequest(NavigationContext navigationContext, Action<bool> continuationCallback);
IConfirmNavigationRequest 執行流程
攔截導航請求
當打開新的導航時, 或許有些情況下你需要經過用戶進行確認, 這個時候, IConfirmNavigationRequest接口可以滿足需求, 如下:
public void ConfirmNavigationRequest(NavigationContext navigationContext, Action<bool> continuationCallback)
{
bool result = true;
if (MessageBox.Show("確認導航?", "溫馨提示", MessageBoxButton.YesNo) == MessageBoxResult.No)
result = false;
//通過回調當前返回的確認結果,決定是否啟動該導航
continuationCallback(result);
}
Navigation Journal
導航日志, 其實就是對導航系統的一個管理功能, 理論上來說, 我們應該知道我們上一步導航的位置、以及下一步導航的位置, 包括我們導航的歷史記錄。以便於我們使用導航對應用程序可以靈活的控制。
IRegionNavigationJournal
該接口包含以下功能:
- GoBack() : 返回上一頁
- CanGoBack : 是否可以返回上一頁
- GoForward(): 返回后一頁
- CanGoForward : 是否可以返回后一頁
1.示例(返回上一頁)
當導航日志當中,包含上一頁的歷史記錄, 如下所示, D的前面有ABC的記錄,所以對於D而言, 它可以返回上一頁, 所以CanGoBack 為True。
2.示例(返回下一頁)
當導航日志當中,包含下一個的歷史記錄,如下所示,D的后面有E的記錄,所以對於D而言,它可以返回下一頁,所以CanGoForward 為True。
下一章預告
本章主要講解:
1.注冊及使用導航、傳遞參數
2.INavigationAware接口作用及執行流程
3.IConfirmNavigationRequest接口作用及執行流程
4.IRegionNavigationJournal接口作用及執行流程
下一章,我們將講解在Prism當中的(DialogService)對話服務。