Prism區(qū)域管理器IRegionManager用法介紹
概要
本文主要介紹Prism的IRegionManager, 主要分析源代碼的執(zhí)行流程, 來(lái)介紹內(nèi)部實(shí)現(xiàn)的幾個(gè)核心接口調(diào)用過(guò)程。
通過(guò)本文, 你可以熟練的掌握Prism當(dāng)中以下接口的作用以及使用方法, 如下所示:
- IRgionManager
- INavigationAware
- INavigateAsync
- IRegionNavigationService
- IConfirmNavigationRequest
- IRegionNavigationContentLoader
閱讀本文章, 您需要掌握一下基本概念:
- 了解Prism的區(qū)域?qū)Ш降拇蟾庞梅?/li>
- 了解如何在導(dǎo)航中傳遞參數(shù)
正文
首先, 通過(guò)一段簡(jiǎn)單的示例來(lái)展示IRegionManager調(diào)用導(dǎo)航的業(yè)務(wù)代碼。
//向RegionA區(qū)域當(dāng)中導(dǎo)航ViewA頁(yè)面, 并且傳遞參數(shù)名Value 值為Hello 的導(dǎo)航參數(shù) var param = new NavigationParameters(); param.Add("Value", "Hello"); regionManager.Regions["RegionA"].RequestNavigate("ViewA", param);
對(duì)應(yīng)在ViewA的DataContext中, 實(shí)現(xiàn)如下:
public class ViewAViewModel : INavigationAware { public bool IsNavigationTarget(NavigationContext navigationContext) { return true; } public void OnNavigatedFrom(NavigationContext navigationContext) { } public void OnNavigatedTo(NavigationContext navigationContext) { //接收導(dǎo)航傳遞的string類型參數(shù)值Value var hello = navigationContext.Parameters.GetValue<string>("Value"); } }
通過(guò)上面兩段代碼中, 可以看到, 通過(guò)IRegionManager實(shí)現(xiàn)了在指定區(qū)域?qū)Ш巾?yè)面并且傳遞參數(shù)的過(guò)程。那么接下來(lái)主要來(lái)通過(guò)源代碼來(lái)解析整個(gè)導(dǎo)航流程,這里面涉及到多個(gè)接口的調(diào)用過(guò)程也會(huì)統(tǒng)一的介紹。
IRegionManager
該接口當(dāng)中公開(kāi)了一個(gè)Regions屬性, 其中包含所有注冊(cè)的區(qū)域, 另外則包含一些方法,AddToRegion、RegisterViewWithRegion、RequestNavigate 作用同樣是向區(qū)域當(dāng)中指定不同的頁(yè)面。
通過(guò)Regions, 我們可以通過(guò)索引器訪問(wèn)不同的區(qū)域并且直接調(diào)用RequestNavigate方法, 因?yàn)镮Region繼承于INavigateAsync, INavigateAsync有RequestNavigate方法
public interface INavigateAsync { void RequestNavigate(Uri target, Action<NavigationResult> navigationCallback); void RequestNavigate(Uri target, Action<NavigationResult> navigationCallback, NavigationParameters navigationParameters); } public interface IRegion : INavigateAsync { }
IRegionNavigationService
了解了IRegionManager 是通過(guò)INavigateAsync接口調(diào)用RequestNavigate來(lái)進(jìn)行導(dǎo)航, 那么我們需要清楚的是, INavigateAsync具體的實(shí)現(xiàn)是在哪里, 這里就涉及到了一個(gè)導(dǎo)航服務(wù)的實(shí)現(xiàn)接口IRegionNavigationService , 該接口繼承于INavigateAsync
public interface IRegionNavigationService : INavigateAsync { }
也就是說(shuō), 我們調(diào)用RequestNavigate, 其實(shí)是通過(guò) IRegionNavigationService的具體實(shí)現(xiàn)類來(lái)完成整個(gè)導(dǎo)航過(guò)程, 接下來(lái)主要分析RegionNavigationService實(shí)現(xiàn)類。
RegionNavigationService
首先, 簡(jiǎn)單的描述整個(gè)導(dǎo)航需要執(zhí)行的邏輯, 如下:
1.構(gòu)建導(dǎo)航的上下文(包含傳遞的參數(shù),最終導(dǎo)航的頁(yè)面)
2.循環(huán)區(qū)域當(dāng)中所有的活動(dòng)視圖, 并且執(zhí)行繼承于IConfirmNavigationRequest接口的實(shí)例
注意: IConfirmNavigationRequest 主要用于在區(qū)域?qū)Ш街械臄r截功能。
使用場(chǎng)景: 例如,當(dāng)前頁(yè)面顯示A, 當(dāng)你導(dǎo)航B的時(shí)候, A如果未保存,可以提示是否切換到B頁(yè)面。
3.循環(huán)區(qū)域當(dāng)中所有的活動(dòng)視圖, 并且執(zhí)行繼承于 INavigationAware 接口的 OnNavigatedFrom方法。
說(shuō)明:調(diào)用OnNavigatedFrom方法,主要告訴活動(dòng)的頁(yè)面, 我現(xiàn)在要導(dǎo)航到指定頁(yè)面, 這樣你可以在OnNavigatedFrom當(dāng)中編寫你所需要的業(yè)務(wù)邏輯。
4.向指定的區(qū)域當(dāng)中添加對(duì)應(yīng)的導(dǎo)航內(nèi)容, 并且激活顯示它。
主要通過(guò) IRegionNavigationContentLoader 接口的 LoadContent 方法來(lái)將內(nèi)容添加到指定區(qū)域當(dāng)中。
注意: 這里會(huì)使用到INavigationAware接口當(dāng)中的IsNavigationTarget方法, 如果該方法設(shè)置為true, 代表重用實(shí)例, 而不是重新初始化。
5.記錄導(dǎo)航日志 IRegionNavigationJournal
說(shuō)明: 通過(guò)導(dǎo)航日志, 我們可以實(shí)現(xiàn)在區(qū)域當(dāng)中返回上一頁(yè)以及下一頁(yè)的功能。
6.觸發(fā)INavigationAware接口的OnNavigatedTo, 傳遞導(dǎo)航的數(shù)據(jù)上下文(包含導(dǎo)航服務(wù)、傳遞參數(shù)等)
7.觸發(fā)導(dǎo)航的回調(diào)方法navigationCallback, 如果存在的話,代碼如下所示:
regionManager.Regions["RegionA"].RequestNavigate("ViewA", back => { if ((bool)back.Result) { //代表導(dǎo)航成功 } });
8.Navigating與Navigated 事件為IRegionNavigationService接口當(dāng)中的成員, 它們分別在導(dǎo)航的不同階段觸發(fā)該類事件。
Navigating: 指定區(qū)域當(dāng)中添加完視圖后并且激活之前調(diào)用
Navigated : 導(dǎo)航完成之后調(diào)用該事件
整個(gè)流程圖,如下圖所示:
總結(jié)
通過(guò)分析RegionNavigationService, 可以了解到, 其內(nèi)部的執(zhí)行邏輯涉及到多個(gè)接口, 其中包含了多個(gè)接口的使用方法, 例如:
- INavigationAware接口的作用, 如何接收導(dǎo)航傳遞的參數(shù), IsNavigationTarget可以重用頁(yè)面實(shí)例, OnNavigatedFrom 可以接收導(dǎo)航過(guò)程的上下文
- IConfirmNavigationRequest接口的作用, 可以用于導(dǎo)航的攔截請(qǐng)求
- IRegionNavigationService接口的作用, 主要用于內(nèi)部的區(qū)域?qū)Ш椒?wù)
- IRegionNavigationContentLoader接口的作用, 主要用于向指定區(qū)域添加內(nèi)容
- IRegionNavigationJournal接口的作用, 主要用于區(qū)域?qū)Ш疆?dāng)中記錄歷史, 用于前后導(dǎo)航的, 返回上一頁(yè)下一頁(yè)。
到此這篇關(guān)于Prism區(qū)域管理器IRegionManager用法介紹的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C#/.NET使用git命令行來(lái)操作git倉(cāng)庫(kù)的方法示例
本文介紹使用 C# 編寫一個(gè) .NET 程序來(lái)自動(dòng)化地使用 git 命令行來(lái)操作 git 倉(cāng)庫(kù)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-04-04.NET?6開(kāi)發(fā)TodoList應(yīng)用實(shí)現(xiàn)系列背景
這篇文章主要介紹了.NET?6開(kāi)發(fā)TodoList應(yīng)用實(shí)現(xiàn)系列背景,NET?6是一個(gè)很優(yōu)秀的框架,這一點(diǎn)自從我最開(kāi)始接觸.NET?Core?2起一年一年進(jìn)化到現(xiàn)在,就深切地感受到,那好東西就拿出來(lái)和大家分享一下,下面來(lái)看一下文章的學(xué)習(xí)介紹吧2021-12-12C#.net 微信公眾賬號(hào)接口開(kāi)發(fā)
這篇文章主要介紹了C#.net 微信公眾賬號(hào)接口開(kāi)發(fā),需要的朋友可以參考下2016-05-05asp.net Request.ServerVariables[] 讀解
asp.net Request.ServerVariables[] 讀解,學(xué)習(xí).net的朋友可以參考下,方便獲取服務(wù)器的一些信息。2011-08-08C# 沒(méi)有動(dòng)態(tài)的數(shù)組,可以用arraylist或list取代
C#里沒(méi)有動(dòng)態(tài)的數(shù)組,只能用arraylist或list取代。2009-06-06asp.net編程獲取項(xiàng)目根目錄實(shí)現(xiàn)方法集合
這篇文章主要介紹了asp.net編程獲取項(xiàng)目根目錄實(shí)現(xiàn)方法,結(jié)合實(shí)例形式分析總結(jié)了asp.net針對(duì)項(xiàng)目目錄的操作技巧與注意事項(xiàng),需要的朋友可以參考下2015-11-11在Repeater控件中通過(guò)Eval的方式綁定Style樣式代碼
這篇文章主要介紹了如何在Repeater控件中通過(guò)Eval的方式綁定Style樣式,需要的朋友可以參考下2014-04-04