網(wǎng)站首頁 編程語言 正文
概要
本文主要介紹Prism的IRegionManager, 主要分析源代碼的執(zhí)行流程, 來介紹內(nèi)部實現(xiàn)的幾個核心接口調(diào)用過程。
通過本文, 你可以熟練的掌握Prism當(dāng)中以下接口的作用以及使用方法, 如下所示:
- IRgionManager
- INavigationAware
- INavigateAsync
- IRegionNavigationService
- IConfirmNavigationRequest
- IRegionNavigationContentLoader
閱讀本文章, 您需要掌握一下基本概念:
- 了解Prism的區(qū)域?qū)Ш降拇蟾庞梅?/li>
- 了解如何在導(dǎo)航中傳遞參數(shù)
正文
首先, 通過一段簡單的示例來展示IRegionManager調(diào)用導(dǎo)航的業(yè)務(wù)代碼。
//向RegionA區(qū)域當(dāng)中導(dǎo)航ViewA頁面, 并且傳遞參數(shù)名Value 值為Hello 的導(dǎo)航參數(shù) var param = new NavigationParameters(); param.Add("Value", "Hello"); regionManager.Regions["RegionA"].RequestNavigate("ViewA", param);
對應(yīng)在ViewA的DataContext中, 實現(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"); } }
通過上面兩段代碼中, 可以看到, 通過IRegionManager實現(xiàn)了在指定區(qū)域?qū)Ш巾撁娌⑶覀鬟f參數(shù)的過程。那么接下來主要來通過源代碼來解析整個導(dǎo)航流程,這里面涉及到多個接口的調(diào)用過程也會統(tǒng)一的介紹。
IRegionManager
該接口當(dāng)中公開了一個Regions屬性, 其中包含所有注冊的區(qū)域, 另外則包含一些方法,AddToRegion、RegisterViewWithRegion、RequestNavigate 作用同樣是向區(qū)域當(dāng)中指定不同的頁面。
通過Regions, 我們可以通過索引器訪問不同的區(qū)域并且直接調(diào)用RequestNavigate方法, 因為IRegion繼承于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 是通過INavigateAsync接口調(diào)用RequestNavigate來進行導(dǎo)航, 那么我們需要清楚的是, INavigateAsync具體的實現(xiàn)是在哪里, 這里就涉及到了一個導(dǎo)航服務(wù)的實現(xiàn)接口IRegionNavigationService , 該接口繼承于INavigateAsync
public interface IRegionNavigationService : INavigateAsync { }
也就是說, 我們調(diào)用RequestNavigate, 其實是通過 IRegionNavigationService的具體實現(xiàn)類來完成整個導(dǎo)航過程, 接下來主要分析RegionNavigationService實現(xiàn)類。
RegionNavigationService
首先, 簡單的描述整個導(dǎo)航需要執(zhí)行的邏輯, 如下:
1.構(gòu)建導(dǎo)航的上下文(包含傳遞的參數(shù),最終導(dǎo)航的頁面)
2.循環(huán)區(qū)域當(dāng)中所有的活動視圖, 并且執(zhí)行繼承于IConfirmNavigationRequest接口的實例
注意: IConfirmNavigationRequest 主要用于在區(qū)域?qū)Ш街械臄r截功能。
使用場景: 例如,當(dāng)前頁面顯示A, 當(dāng)你導(dǎo)航B的時候, A如果未保存,可以提示是否切換到B頁面。
3.循環(huán)區(qū)域當(dāng)中所有的活動視圖, 并且執(zhí)行繼承于 INavigationAware 接口的 OnNavigatedFrom方法。
說明:調(diào)用OnNavigatedFrom方法,主要告訴活動的頁面, 我現(xiàn)在要導(dǎo)航到指定頁面, 這樣你可以在OnNavigatedFrom當(dāng)中編寫你所需要的業(yè)務(wù)邏輯。
4.向指定的區(qū)域當(dāng)中添加對應(yīng)的導(dǎo)航內(nèi)容, 并且激活顯示它。
主要通過 IRegionNavigationContentLoader 接口的 LoadContent 方法來將內(nèi)容添加到指定區(qū)域當(dāng)中。
注意: 這里會使用到INavigationAware接口當(dāng)中的IsNavigationTarget方法, 如果該方法設(shè)置為true, 代表重用實例, 而不是重新初始化。
5.記錄導(dǎo)航日志 IRegionNavigationJournal
說明: 通過導(dǎo)航日志, 我們可以實現(xiàn)在區(qū)域當(dāng)中返回上一頁以及下一頁的功能。
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)用該事件
整個流程圖,如下圖所示:
總結(jié)
通過分析RegionNavigationService, 可以了解到, 其內(nèi)部的執(zhí)行邏輯涉及到多個接口, 其中包含了多個接口的使用方法, 例如:
- INavigationAware接口的作用, 如何接收導(dǎo)航傳遞的參數(shù), IsNavigationTarget可以重用頁面實例, OnNavigatedFrom 可以接收導(dǎo)航過程的上下文
- IConfirmNavigationRequest接口的作用, 可以用于導(dǎo)航的攔截請求
- IRegionNavigationService接口的作用, 主要用于內(nèi)部的區(qū)域?qū)Ш椒?wù)
- IRegionNavigationContentLoader接口的作用, 主要用于向指定區(qū)域添加內(nèi)容
- IRegionNavigationJournal接口的作用, 主要用于區(qū)域?qū)Ш疆?dāng)中記錄歷史, 用于前后導(dǎo)航的, 返回上一頁下一頁。
原文鏈接:https://www.cnblogs.com/zh7791/p/15787447.html
相關(guān)推薦
- 2022-05-06 Python學(xué)習(xí)之模塊化程序設(shè)計示例詳解_python
- 2022-08-27 C#8.0中的模式匹配_C#教程
- 2022-12-02 Android?使用?okhttp3和retrofit2?進行單文件和多文件上傳_Android
- 2022-11-23 Python字符串格式化實例講解_python
- 2022-06-22 C++深度探索運算符重載和返回值優(yōu)化_C 語言
- 2022-03-27 MongoDB的常用命令匯總(Mongo4.2.8)_MongoDB
- 2022-11-23 linux下解決?git?clone每次都要輸入用戶名密碼問題(推薦)_linux shell
- 2022-08-15 Android開發(fā)gradle拉取依賴的加速配置_Android
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支