WPF框架Prism中導(dǎo)航Navigation用法介紹
使用場景
在普遍的業(yè)務(wù)場景當(dāng)中, 必不可少的是頁面切換, 而Prism就可以使用Navigation功能來進(jìn)行頁面導(dǎo)航, 在不同的場景當(dāng)中會(huì)有各種用法, 例如在切換頁面驗(yàn)證、傳遞參數(shù)、返回上一頁、返回下一頁等功能。
導(dǎo)航的基本條件
1.注冊(cè)顯示區(qū)域
2.注冊(cè)導(dǎo)航頁面
1.注冊(cè)導(dǎo)航
注冊(cè)視圖類型或添加別名, 如果為指定別名,名稱默認(rèn)為當(dāng)中類型的名稱
public class ModuleAModule : IModule
{
public void OnInitialized(IContainerProvider containerProvider)
{
}
public void RegisterTypes(IContainerRegistry containerRegistry)
{
//添加別名 "CustomName"
containerRegistry.RegisterForNavigation<ViewA>("CustomName");
//默認(rèn)名稱 "ViewB"
containerRegistry.RegisterForNavigation<ViewB>();
}
}注冊(cè)時(shí),指定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.使用導(dǎo)航
正如前面的章節(jié)所講到, Region的注冊(cè)以及管理、導(dǎo)航等, 我們可以使用IRegionManager接口,所以,我們現(xiàn)在便可以使用該接口實(shí)現(xiàn)導(dǎo)航功能, 如下所示:
IRegionManager regionManager = …;
regionManager.RequestNavigate("RegionName", "ViewName");可以注意點(diǎn), 我們調(diào)用了IRegionManager接口的RequestNavigate方法, 并且傳遞了兩個(gè)參數(shù):
- RegionName: 該參數(shù)為注冊(cè)的區(qū)域名稱
- ViewName: 該參數(shù)實(shí)際為我們上面注冊(cè)過的導(dǎo)航頁, 字符串類型, 對(duì)應(yīng)的是我們注冊(cè)頁面的nameof
3.帶參數(shù)導(dǎo)航
正如,我們想要在導(dǎo)航頁前, 傳遞一些參數(shù), 則可以使用NavigationParameters, 如下所示:
var param = new NavigationParameters();
param.Add("Parameter", param);
_regionManger.RequestNavigate("RegionName", "ViewName", param);
//類似URL地址傳遞參數(shù)
_regionManger.RequestNavigate("RegionName", "ViewName?id=1&Name=xiaoming");疑問?
當(dāng)我們使用導(dǎo)航為指定區(qū)域注冊(cè)視圖時(shí), 我們?cè)趺纯刂拼蜷_的過程? 所以, 下面我們將講解一下
INavigationAware接口。
INavigationAware
該接口包含3個(gè)方法, 每個(gè)方法中都包含當(dāng)前導(dǎo)航的上下文, 如下所示:
public void OnNavigatedTo(NavigationContext navigationContext)
{
}
public bool IsNavigationTarget(NavigationContext navigationContext)
{
return true;
}
public void OnNavigatedFrom(NavigationContext navigationContext)
{
}- OnNavigatedTo: 導(dǎo)航完成前, 此處可以傳遞過來的參數(shù)以及是否允許導(dǎo)航等動(dòng)作的控制。
- IsNavigationTarget: 調(diào)用以確定此實(shí)例是否可以處理導(dǎo)航請(qǐng)求。否則新建實(shí)例
- OnNavigatedFrom: 當(dāng)導(dǎo)航離開當(dāng)前頁時(shí), 類似打開A, 再打開B時(shí), 該方法被觸發(fā)。
INavigationAware 執(zhí)行流程

獲取導(dǎo)航請(qǐng)求參數(shù)
正如上面所描述, 導(dǎo)航中允許我們傳遞參數(shù), 用于在我們完成導(dǎo)航之前, 進(jìn)行做對(duì)應(yīng)的邏輯業(yè)務(wù)處理。這時(shí)候, 我們便可以在OnNavigatedTo方法中通過導(dǎo)航上下文中獲取到傳遞的所有參數(shù)。如下:
public void OnNavigatedTo(NavigationContext navigationContext)
{
var id = navigationContext.Parameters.GetValue<int>("id");
var name = navigationContext.Parameters["Name"].ToString();
}IConfirmNavigationRequest
該接口繼承于INavigationAware, 所以, 它多了一個(gè)功能: 允許用戶針對(duì)導(dǎo)航請(qǐng)求進(jìn)行攔截。
//多了一個(gè)回調(diào)函數(shù), 該值覺得是否攔截該導(dǎo)航請(qǐng)求
void ConfirmNavigationRequest(NavigationContext navigationContext, Action<bool> continuationCallback);IConfirmNavigationRequest 執(zhí)行流程

攔截導(dǎo)航請(qǐng)求
當(dāng)打開新的導(dǎo)航時(shí), 或許有些情況下你需要經(jīng)過用戶進(jìn)行確認(rèn), 這個(gè)時(shí)候, IConfirmNavigationRequest接口可以滿足需求, 如下:
public void ConfirmNavigationRequest(NavigationContext navigationContext, Action<bool> continuationCallback)
{
bool result = true;
if (MessageBox.Show("確認(rèn)導(dǎo)航?", "溫馨提示", MessageBoxButton.YesNo) == MessageBoxResult.No)
result = false;
//通過回調(diào)當(dāng)前返回的確認(rèn)結(jié)果,決定是否啟動(dòng)該導(dǎo)航
continuationCallback(result);
}Navigation Journal
導(dǎo)航日志, 其實(shí)就是對(duì)導(dǎo)航系統(tǒng)的一個(gè)管理功能, 理論上來說, 我們應(yīng)該知道我們上一步導(dǎo)航的位置、以及下一步導(dǎo)航的位置, 包括我們導(dǎo)航的歷史記錄。以便于我們使用導(dǎo)航對(duì)應(yīng)用程序可以靈活的控制。
IRegionNavigationJournal
該接口包含以下功能:
- GoBack() : 返回上一頁
- CanGoBack : 是否可以返回上一頁
- GoForward(): 返回后一頁
- CanGoForward : 是否可以返回后一頁
1.示例(返回上一頁)
當(dāng)導(dǎo)航日志當(dāng)中,包含上一頁的歷史記錄, 如下所示, D的前面有ABC的記錄,所以對(duì)于D而言, 它可以返回上一頁, 所以CanGoBack 為True。

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

到此這篇關(guān)于WPF框架Prism中導(dǎo)航Navigation用法介紹的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Asp.Net 不同的OnClick事件區(qū)別小結(jié)(onserverclick,onclientclick)
下面以 HTML的按鈕( system.web.ui.htmlcontrols ) 和 ASP.NET服務(wù)端按鈕 ( system.web.ui.webcontrols ) 為例2012-05-05
C#命名空間System.ComponentModel屬性方法匯總
本文詳細(xì)講解了C#命名空間System.ComponentModel屬性方法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-01-01
ASP.NET Core使用IHttpClientFactory發(fā)出HTTP請(qǐng)求
這篇文章介紹了ASP.NET Core使用IHttpClientFactory發(fā)出HTTP請(qǐng)求的方法,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-04-04
asp.net平臺(tái)下C#實(shí)現(xiàn)Socket通信
這篇文章介紹了asp.net平臺(tái)下C#實(shí)現(xiàn)Socket通信的方法,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-01-01
.Net?Core中使用MongoDB搭建集群與項(xiàng)目實(shí)戰(zhàn)
本文詳細(xì)講解了.Net?Core中使用MongoDB搭建集群與項(xiàng)目實(shí)戰(zhàn),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-02-02
.Net創(chuàng)建型設(shè)計(jì)模式之工廠方法模式(Factory?Method)
這篇文章介紹了.Net設(shè)計(jì)模式之工廠方法模式(Factory?Method),文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-05-05
.Net行為型設(shè)計(jì)模式之備忘錄模式(Memento)
這篇文章介紹了.Net行為型設(shè)計(jì)模式之備忘錄模式(Memento),文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-05-05

