WPF Prism框架合集(7.Navigation)
上一章回顧
Prism框架與其它框架的區(qū)別
Prism當(dāng)中的Binding用法
Command和CompositeCommand 用法
IEventAggregator 以及Filtering Events 用法
本章節(jié)將講解Prism當(dāng)中的Navigation導(dǎo)航功能
使用場(chǎng)景
在普遍的業(yè)務(wù)場(chǎng)景當(dāng)中, 必不可少的是頁(yè)面切換, 而Prism就可以使用Navigation功能來(lái)進(jìn)行頁(yè)面導(dǎo)航, 在不同的場(chǎng)景當(dāng)中會(huì)有各種用法, 例如在切換頁(yè)面驗(yàn)證、傳遞參數(shù)、返回上一頁(yè)、返回下一頁(yè)等功能。
導(dǎo)航的基本條件
1.注冊(cè)顯示區(qū)域
2.注冊(cè)導(dǎo)航頁(yè)面
1.注冊(cè)導(dǎo)航
注冊(cè)視圖類(lèi)型或添加別名,?如果為指定別名,名稱(chēng)默認(rèn)為當(dāng)中類(lèi)型的名稱(chēng)

注冊(cè)時(shí),指定ViewModel或添加別名。

2.使用導(dǎo)航
正如前面的章節(jié)所講到, Region的注冊(cè)以及管理、導(dǎo)航等, 我們可以使用IRegionManager接口,所以,我們現(xiàn)在便可以使用該接口實(shí)現(xiàn)導(dǎo)航功能, 如下所示:

可以注意點(diǎn), 我們調(diào)用了IRegionManager接口的RequestNavigate方法, 并且傳遞了兩個(gè)參數(shù):
RegionName: 該參數(shù)為注冊(cè)的區(qū)域名稱(chēng)
ViewName: 該參數(shù)實(shí)際為我們上面注冊(cè)過(guò)的導(dǎo)航頁(yè), 字符串類(lèi)型, 對(duì)應(yīng)的是我們注冊(cè)頁(yè)面的nameof
3.帶參數(shù)導(dǎo)航
正如,我們想要在導(dǎo)航頁(yè)前, 傳遞一些參數(shù), 則可以使用NavigationParameters, 如下所示:

疑問(wèn)?
當(dāng)我們使用導(dǎo)航為指定區(qū)域注冊(cè)視圖時(shí), 我們?cè)趺纯刂拼蜷_(kāi)的過(guò)程? 所以, 下面我們將講解一下
INavigationAware接口。
INavigationAware
該接口包含3個(gè)方法, 每個(gè)方法中都包含當(dāng)前導(dǎo)航的上下文, 如下所示:

OnNavigatedTo: 導(dǎo)航完成前, 此處可以傳遞過(guò)來(lái)的參數(shù)以及是否允許導(dǎo)航等動(dòng)作的控制。
IsNavigationTarget: 調(diào)用以確定此實(shí)例是否可以處理導(dǎo)航請(qǐng)求。否則新建實(shí)例
OnNavigatedFrom: 當(dāng)導(dǎo)航離開(kāi)當(dāng)前頁(yè)時(shí), 類(lèi)似打開(kāi)A, 再打開(kāi)B時(shí), 該方法被觸發(fā)。
INavigationAware 執(zhí)行流程

獲取導(dǎo)航請(qǐng)求參數(shù)
正如上面所描述, 導(dǎo)航中允許我們傳遞參數(shù), 用于在我們完成導(dǎo)航之前, 進(jìn)行做對(duì)應(yīng)的邏輯業(yè)務(wù)處理。這時(shí)候, 我們便可以在OnNavigatedTo方法中通過(guò)導(dǎo)航上下文中獲取到傳遞的所有參數(shù)。如下:

IConfirmNavigationRequest
該接口繼承于INavigationAware, 所以, 它多了一個(gè)功能: 允許用戶(hù)針對(duì)導(dǎo)航請(qǐng)求進(jìn)行攔截。

IConfirmNavigationRequest 執(zhí)行流程

攔截導(dǎo)航請(qǐng)求
當(dāng)打開(kāi)新的導(dǎo)航時(shí), 或許有些情況下你需要經(jīng)過(guò)用戶(hù)進(jìn)行確認(rèn), 這個(gè)時(shí)候, IConfirmNavigationRequest接口可以滿足需求, 如下:

Navigation Journal
導(dǎo)航日志, 其實(shí)就是對(duì)導(dǎo)航系統(tǒng)的一個(gè)管理功能, 理論上來(lái)說(shuō), 我們應(yīng)該知道我們上一步導(dǎo)航的位置、以及下一步導(dǎo)航的位置, 包括我們導(dǎo)航的歷史記錄。以便于我們使用導(dǎo)航對(duì)應(yīng)用程序可以靈活的控制。
IRegionNavigationJournal
該接口包含以下功能:
GoBack() : 返回上一頁(yè)
CanGoBack : 是否可以返回上一頁(yè)
GoForward(): 返回后一頁(yè)
CanGoForward : 是否可以返回后一頁(yè)
1.示例(返回上一頁(yè))
當(dāng)導(dǎo)航日志當(dāng)中,包含上一頁(yè)的歷史記錄, 如下所示, D的前面有ABC的記錄,所以對(duì)于D而言, 它可以返回上一頁(yè), 所以CanGoBack 為T(mén)rue。

2.示例(返回下一頁(yè))
當(dāng)導(dǎo)航日志當(dāng)中,包含下一個(gè)的歷史記錄,如下所示,D的后面有E的記錄,所以對(duì)于D而言,它可以返回下一頁(yè),所以CanGoForward 為T(mén)rue。

下一章預(yù)告
本章主要講解:
1.注冊(cè)及使用導(dǎo)航、傳遞參數(shù)
2.INavigationAware接口作用及執(zhí)行流程
3.IConfirmNavigationRequest接口作用及執(zhí)行流程
4.IRegionNavigationJournal接口作用及執(zhí)行流程
下一章,我們將講解在Prism當(dāng)中的(DialogService)對(duì)話服務(wù)。
