Prism區(qū)域管理器IRegionManager用法介紹
概要
本文主要介紹Prism的IRegionManager, 主要分析源代碼的執(zhí)行流程, 來介紹內部實現(xiàn)的幾個核心接口調用過程。
通過本文, 你可以熟練的掌握Prism當中以下接口的作用以及使用方法, 如下所示:
- IRgionManager
- INavigationAware
- INavigateAsync
- IRegionNavigationService
- IConfirmNavigationRequest
- IRegionNavigationContentLoader
閱讀本文章, 您需要掌握一下基本概念:
- 了解Prism的區(qū)域導航的大概用法
- 了解如何在導航中傳遞參數(shù)
正文
首先, 通過一段簡單的示例來展示IRegionManager調用導航的業(yè)務代碼。
//向RegionA區(qū)域當中導航ViewA頁面, 并且傳遞參數(shù)名Value 值為Hello 的導航參數(shù)
var param = new NavigationParameters();
param.Add("Value", "Hello");
regionManager.Regions["RegionA"].RequestNavigate("ViewA", param);對應在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)
{
//接收導航傳遞的string類型參數(shù)值Value
var hello = navigationContext.Parameters.GetValue<string>("Value");
}
}通過上面兩段代碼中, 可以看到, 通過IRegionManager實現(xiàn)了在指定區(qū)域導航頁面并且傳遞參數(shù)的過程。那么接下來主要來通過源代碼來解析整個導航流程,這里面涉及到多個接口的調用過程也會統(tǒng)一的介紹。
IRegionManager
該接口當中公開了一個Regions屬性, 其中包含所有注冊的區(qū)域, 另外則包含一些方法,AddToRegion、RegisterViewWithRegion、RequestNavigate 作用同樣是向區(qū)域當中指定不同的頁面。
通過Regions, 我們可以通過索引器訪問不同的區(qū)域并且直接調用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接口調用RequestNavigate來進行導航, 那么我們需要清楚的是, INavigateAsync具體的實現(xiàn)是在哪里, 這里就涉及到了一個導航服務的實現(xiàn)接口IRegionNavigationService , 該接口繼承于INavigateAsync
public interface IRegionNavigationService : INavigateAsync
{
}也就是說, 我們調用RequestNavigate, 其實是通過 IRegionNavigationService的具體實現(xiàn)類來完成整個導航過程, 接下來主要分析RegionNavigationService實現(xiàn)類。
RegionNavigationService
首先, 簡單的描述整個導航需要執(zhí)行的邏輯, 如下:
1.構建導航的上下文(包含傳遞的參數(shù),最終導航的頁面)
2.循環(huán)區(qū)域當中所有的活動視圖, 并且執(zhí)行繼承于IConfirmNavigationRequest接口的實例
注意: IConfirmNavigationRequest 主要用于在區(qū)域導航中的攔截功能。
使用場景: 例如,當前頁面顯示A, 當你導航B的時候, A如果未保存,可以提示是否切換到B頁面。
3.循環(huán)區(qū)域當中所有的活動視圖, 并且執(zhí)行繼承于 INavigationAware 接口的 OnNavigatedFrom方法。
說明:調用OnNavigatedFrom方法,主要告訴活動的頁面, 我現(xiàn)在要導航到指定頁面, 這樣你可以在OnNavigatedFrom當中編寫你所需要的業(yè)務邏輯。
4.向指定的區(qū)域當中添加對應的導航內容, 并且激活顯示它。
主要通過 IRegionNavigationContentLoader 接口的 LoadContent 方法來將內容添加到指定區(qū)域當中。
注意: 這里會使用到INavigationAware接口當中的IsNavigationTarget方法, 如果該方法設置為true, 代表重用實例, 而不是重新初始化。
5.記錄導航日志 IRegionNavigationJournal
說明: 通過導航日志, 我們可以實現(xiàn)在區(qū)域當中返回上一頁以及下一頁的功能。
6.觸發(fā)INavigationAware接口的OnNavigatedTo, 傳遞導航的數(shù)據(jù)上下文(包含導航服務、傳遞參數(shù)等)
7.觸發(fā)導航的回調方法navigationCallback, 如果存在的話,代碼如下所示:
regionManager.Regions["RegionA"].RequestNavigate("ViewA",
back =>
{
if ((bool)back.Result)
{
//代表導航成功
}
});8.Navigating與Navigated 事件為IRegionNavigationService接口當中的成員, 它們分別在導航的不同階段觸發(fā)該類事件。
Navigating: 指定區(qū)域當中添加完視圖后并且激活之前調用
Navigated : 導航完成之后調用該事件
整個流程圖,如下圖所示:

總結
通過分析RegionNavigationService, 可以了解到, 其內部的執(zhí)行邏輯涉及到多個接口, 其中包含了多個接口的使用方法, 例如:
- INavigationAware接口的作用, 如何接收導航傳遞的參數(shù), IsNavigationTarget可以重用頁面實例, OnNavigatedFrom 可以接收導航過程的上下文
- IConfirmNavigationRequest接口的作用, 可以用于導航的攔截請求
- IRegionNavigationService接口的作用, 主要用于內部的區(qū)域導航服務
- IRegionNavigationContentLoader接口的作用, 主要用于向指定區(qū)域添加內容
- IRegionNavigationJournal接口的作用, 主要用于區(qū)域導航當中記錄歷史, 用于前后導航的, 返回上一頁下一頁。
到此這篇關于Prism區(qū)域管理器IRegionManager用法介紹的文章就介紹到這了。希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
.NET?6開發(fā)TodoList應用實現(xiàn)系列背景
這篇文章主要介紹了.NET?6開發(fā)TodoList應用實現(xiàn)系列背景,NET?6是一個很優(yōu)秀的框架,這一點自從我最開始接觸.NET?Core?2起一年一年進化到現(xiàn)在,就深切地感受到,那好東西就拿出來和大家分享一下,下面來看一下文章的學習介紹吧2021-12-12
asp.net Request.ServerVariables[] 讀解
asp.net Request.ServerVariables[] 讀解,學習.net的朋友可以參考下,方便獲取服務器的一些信息。2011-08-08
C# 沒有動態(tài)的數(shù)組,可以用arraylist或list取代
C#里沒有動態(tài)的數(shù)組,只能用arraylist或list取代。2009-06-06
在Repeater控件中通過Eval的方式綁定Style樣式代碼
這篇文章主要介紹了如何在Repeater控件中通過Eval的方式綁定Style樣式,需要的朋友可以參考下2014-04-04

