首頁 > 軟體

Prism區域管理器IRegionManager用法介紹

2022-02-16 10:00:44

概要

本文主要介紹Prism的IRegionManager, 主要分析原始碼的執行流程, 來介紹內部實現的幾個核心介面呼叫過程。

通過本文, 你可以熟練的掌握Prism當中以下介面的作用以及使用方法, 如下所示:

  • IRgionManager
  • INavigationAware
  • INavigateAsync
  • IRegionNavigationService
  • IConfirmNavigationRequest
  • IRegionNavigationContentLoader

閱讀本文章, 您需要掌握一下基本概念:

  • 瞭解Prism的區域導航的大概用法
  • 瞭解如何在導航中傳遞引數

正文

首先, 通過一段簡單的範例來展示IRegionManager呼叫導航的業務程式碼。

//向RegionA區域當中導航ViewA頁面, 並且傳遞引數名Value 值為Hello 的導航引數
var param = new NavigationParameters();
param.Add("Value", "Hello");

regionManager.Regions["RegionA"].RequestNavigate("ViewA", param);

對應在ViewA的DataContext中, 實現如下:

public class ViewAViewModel : INavigationAware
    {
        public bool IsNavigationTarget(NavigationContext navigationContext)
        {
            return true;
        }

        public void OnNavigatedFrom(NavigationContext navigationContext)
        {  }

        public void OnNavigatedTo(NavigationContext navigationContext)
        {
            //接收導航傳遞的string型別引數值Value
            var hello = navigationContext.Parameters.GetValue<string>("Value");
        }
    }

通過上面兩段程式碼中, 可以看到, 通過IRegionManager實現了在指定區域導航頁面並且傳遞引數的過程。那麼接下來主要來通過原始碼來解析整個導航流程,這裡面涉及到多個介面的呼叫過程也會統一的介紹。

IRegionManager

該介面當中公開了一個Regions屬性, 其中包含所有註冊的區域, 另外則包含一些方法,AddToRegion、RegisterViewWithRegion、RequestNavigate 作用同樣是向區域當中指定不同的頁面。

通過Regions, 我們可以通過索引器存取不同的區域並且直接呼叫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具體的實現是在哪裡, 這裡就涉及到了一個導航服務的實現介面IRegionNavigationService , 該介面繼承於INavigateAsync

public interface IRegionNavigationService : INavigateAsync
{
}

也就是說, 我們呼叫RequestNavigate, 其實是通過 IRegionNavigationService的具體實現類來完成整個導航過程, 接下來主要分析RegionNavigationService實現類。

RegionNavigationService

首先, 簡單的描述整個導航需要執行的邏輯, 如下:

1.構建導航的上下文(包含傳遞的引數,最終導航的頁面)

2.迴圈區域當中所有的活動檢視, 並且執行繼承於IConfirmNavigationRequest介面的範例
注意: IConfirmNavigationRequest 主要用於在區域導航中的攔截功能。
使用場景: 例如,當前頁面顯示A, 當你導航B的時候, A如果未儲存,可以提示是否切換到B頁面。

3.迴圈區域當中所有的活動檢視, 並且執行繼承於 INavigationAware 介面的 OnNavigatedFrom方法。
說明:呼叫OnNavigatedFrom方法,主要告訴活動的頁面, 我現在要導航到指定頁面, 這樣你可以在OnNavigatedFrom當中編寫你所需要的業務邏輯。

4.向指定的區域當中新增對應的導航內容, 並且啟用顯示它。
主要通過 IRegionNavigationContentLoader 介面的 LoadContent 方法來將內容新增到指定區域當中。
注意: 這裡會使用到INavigationAware介面當中的IsNavigationTarget方法, 如果該方法設定為true, 代表重用範例, 而不是重新初始化。

5.記錄導航紀錄檔 IRegionNavigationJournal
說明: 通過導航紀錄檔, 我們可以實現在區域當中返回上一頁以及下一頁的功能。

6.觸發INavigationAware介面的OnNavigatedTo, 傳遞導航的資料上下文(包含導航服務、傳遞引數等)

7.觸發導航的回撥方法navigationCallback, 如果存在的話,程式碼如下所示:

regionManager.Regions["RegionA"].RequestNavigate("ViewA",
                back =>
            {
                if ((bool)back.Result)
                {
                    //代表導航成功
                }
            });

8.Navigating與Navigated 事件為IRegionNavigationService介面當中的成員, 它們分別在導航的不同階段觸發該類事件。
Navigating: 指定區域當中新增完檢視後並且啟用之前呼叫
Navigated : 導航完成之後呼叫該事件

整個流程圖,如下圖所示:

總結

通過分析RegionNavigationService, 可以瞭解到, 其內部的執行邏輯涉及到多個介面, 其中包含了多個介面的使用方法, 例如:

  • INavigationAware介面的作用, 如何接收導航傳遞的引數, IsNavigationTarget可以重用頁面範例, OnNavigatedFrom 可以接收導航過程的上下文
  • IConfirmNavigationRequest介面的作用, 可以用於導航的攔截請求
  • IRegionNavigationService介面的作用, 主要用於內部的區域導航服務
  • IRegionNavigationContentLoader介面的作用, 主要用於向指定區域新增內容
  • IRegionNavigationJournal介面的作用, 主要用於區域導航當中記錄歷史, 用於前後導航的, 返回上一頁下一頁。

 到此這篇關於Prism區域管理器IRegionManager用法介紹的文章就介紹到這了。希望對大家的學習有所幫助,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com