WPF框架Prism中導(dǎo)航Navigation用法介紹
使用場(chǎng)景
在普遍的業(yè)務(wù)場(chǎng)景當(dāng)中, 必不可少的是頁(yè)面切換, 而Prism就可以使用Navigation功能來進(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è)視圖類型或添加別名, 如果為指定別名,名稱默認(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)航頁(yè), 字符串類型, 對(duì)應(yīng)的是我們注冊(cè)頁(yè)面的nameof
3.帶參數(shù)導(dǎo)航
正如,我們想要在導(dǎo)航頁(yè)前, 傳遞一些參數(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)前頁(yè)時(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() : 返回上一頁(yè)
- CanGoBack : 是否可以返回上一頁(yè)
- GoForward(): 返回后一頁(yè)
- CanGoForward : 是否可以返回后一頁(yè)
1.示例(返回上一頁(yè))
當(dāng)導(dǎo)航日志當(dāng)中,包含上一頁(yè)的歷史記錄, 如下所示, D的前面有ABC的記錄,所以對(duì)于D而言, 它可以返回上一頁(yè), 所以CanGoBack 為True。
2.示例(返回下一頁(yè))
當(dāng)導(dǎo)航日志當(dāng)中,包含下一個(gè)的歷史記錄,如下所示,D的后面有E的記錄,所以對(duì)于D而言,它可以返回下一頁(yè),所以CanGoForward 為True。
到此這篇關(guān)于WPF框架Prism中導(dǎo)航Navigation用法介紹的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
學(xué)會(huì)區(qū)分Visual Studio 2005,Visual Studio 2005 Team System和MSDN P
學(xué)會(huì)區(qū)分Visual Studio 2005,Visual Studio 2005 Team System和MSDN Premium 訂閱的各個(gè)版本...2007-01-01.NET?6更新使.NET生態(tài)系統(tǒng)蛻變
微軟正式發(fā)布.NET最新長(zhǎng)期支持版本.NET?6,這個(gè)版本的更新重點(diǎn),除了C#和F#都有許多語言功能改進(jìn)之外,.NET?6終于集大成,成為跨瀏覽器、云計(jì)算、桌面、物聯(lián)網(wǎng)和移動(dòng)應(yīng)用程序的統(tǒng)一平臺(tái),性能也獲得大幅提升,并且更完整支持Arm642022-01-01ASP.Net?Core?MVC基礎(chǔ)系列之項(xiàng)目創(chuàng)建
這篇文章介紹了創(chuàng)建ASP.Net?Core?MVC項(xiàng)目的方法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-02-02ASP.NET2.0+SQL Server2005構(gòu)建多層應(yīng)用
ASP.NET2.0+SQL Server2005構(gòu)建多層應(yīng)用...2006-12-12ABP框架的體系結(jié)構(gòu)及模塊系統(tǒng)講解
ABP框架是基于ASP.NET的Web開發(fā)框架,不過它遵循一種名為DDD(領(lǐng)域驅(qū)動(dòng)設(shè)計(jì))的設(shè)計(jì)模式原則,接下來我們就來看一下ABP框架的體系結(jié)構(gòu)及模塊系統(tǒng)講解2016-06-06