日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

Prism源代码解析(IRegionManager)

發(fā)布時(shí)間:2023/12/4 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Prism源代码解析(IRegionManager) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

概要

本文主要介紹Prism的IRegionManager, 主要分析源代碼的執(zhí)行流程, 來(lái)介紹內(nèi)部實(shí)現(xiàn)的幾個(gè)核心接口調(diào)用過程。
通過本文, 你可以熟練的掌握Prism當(dāng)中以下接口的作用以及使用方法, 如下所示:

  • IRgionManager

  • INavigationAware

  • INavigateAsync

  • IRegionNavigationService

  • IConfirmNavigationRequest

  • IRegionNavigationContentLoader

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

  • 了解Prism的區(qū)域?qū)Ш降拇蟾庞梅?/p>

  • 了解如何在導(dǎo)航中傳遞參數(shù)

正文

首先, 通過一段簡(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ù)值Valuevar hello = navigationContext.Parameters.GetValue<string>("Value");}}

通過上面兩段代碼中, 可以看到, 通過IRegionManager實(shí)現(xiàn)了在指定區(qū)域?qū)Ш巾?yè)面并且傳遞參數(shù)的過程。那么接下來(lái)主要來(lái)通過源代碼來(lái)解析整個(gè)導(dǎo)航流程,這里面涉及到多個(gè)接口的調(diào)用過程也會(huì)統(tǒng)一的介紹。

IRegionManager

該接口當(dāng)中公開了一個(gè)Regions屬性, 其中包含所有注冊(cè)的區(qū)域, 另外則包含一些方法,AddToRegion、RegisterViewWithRegion、RequestNavigate 作用同樣是向區(qū)域當(dāng)中指定不同的頁(yè)面。

通過Regions, 我們可以通過索引器訪問不同的區(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 是通過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í)是通過 IRegionNavigationService的具體實(shí)現(xiàn)類來(lái)完成整個(gè)導(dǎo)航過程, 接下來(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)容, 并且激活顯示它。
主要通過 IRegionNavigationContentLoader 接口的 LoadContent 方法來(lái)將內(nèi)容添加到指定區(qū)域當(dāng)中。
注意: 這里會(huì)使用到INavigationAware接口當(dāng)中的IsNavigationTarget方法, 如果該方法設(shè)置為true, 代表重用實(shí)例, 而不是重新初始化。

5.記錄導(dǎo)航日志 IRegionNavigationJournal
說(shuō)明: 通過導(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é)

通過分析RegionNavigationService, 可以了解到, 其內(nèi)部的執(zhí)行邏輯涉及到多個(gè)接口, 其中包含了多個(gè)接口的使用方法, 例如:

  • INavigationAware接口的作用, 如何接收導(dǎo)航傳遞的參數(shù), IsNavigationTarget可以重用頁(yè)面實(shí)例, OnNavigatedFrom 可以接收導(dǎo)航過程的上下文

  • IConfirmNavigationRequest接口的作用, 可以用于導(dǎo)航的攔截請(qǐng)求

  • IRegionNavigationService接口的作用, 主要用于內(nèi)部的區(qū)域?qū)Ш椒?wù)

  • IRegionNavigationContentLoader接口的作用, 主要用于向指定區(qū)域添加內(nèi)容

  • IRegionNavigationJournal接口的作用, 主要用于區(qū)域?qū)Ш疆?dāng)中記錄歷史, 用于前后導(dǎo)航的, 返回上一頁(yè)下一頁(yè)。

  • 總結(jié)

    以上是生活随笔為你收集整理的Prism源代码解析(IRegionManager)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 国产一级片自拍 | 成年人视频在线免费看 | 日本边添边摸边做边爱 | 在线播放少妇奶水过盛 | 欧美视频91| 亚洲va国产天堂va久久 en | 天天干天天谢 | av第下页| 亚洲欧美日韩精品 | 日本人妻丰满熟妇久久久久久 | 午夜久久久久久噜噜噜噜 | 黄色片欧美 | 亚洲最新中文字幕 | 91亚洲高清 | 在线91视频 | 小柔的淫辱日记(h | 色综合久久五月 | 在线播放第一页 | 国产色婷婷 | 中文字幕在线观看免费 | 亚洲一区二区三区高清 | 激情久久久 | 黄色成人小视频 | av网站有哪些 | 精品国产九九九 | 国产又粗又猛又黄又爽无遮挡 | 美女视频免费在线观看 | 网友自拍第一页 | 国产婷婷色| 色乱码一区二区三区 | 欧美a一级片 | 日韩欧美精品中文字幕 | 久久国产情侣 | 999www| 极品少妇网站 | av88av| 毛片无遮挡高清免费观看 | 成人午夜在线 | 臭脚猛1s民工调教奴粗口视频 | 亚州精品国产精品乱码不99按摩 | 韩国美女主播跳舞 | 亚洲一区二区精品在线观看 | 草草影院在线播放 | 亚洲九区| 亚洲色图二区 | 成人午夜视频免费在线观看 | 亚洲天堂av中文字幕 | 欧美日韩xxx | aaa影院| 伊人久久大香 | 久久六六 | 国产精品福利一区二区三区 | 日韩精品一区二区三区在线观看 | 成人勉费视频 | 欧美a级在线免费观看 | 香蕉久久夜色精品国产使用方法 | 影视av | 在线免费观看国产 | 日本一区二区三区电影在线观看 | 欧美精品自拍视频 | 日韩三区四区 | 中文字幕视频在线 | 黄色国产片 | 婷婷在线免费视频 | 青娱乐超碰在线 | 国产黄色免费大片 | 国产人妻777人伦精品hd | 欧美一区二区三区成人 | 一卡二卡在线观看 | 国产婷婷色 | 极品国产在线 | 少妇看片 | 热热热av | 亚洲一区二区小说 | 欧美 日韩 成人 | 成人黄色在线网站 | 国产一级做a爱片久久毛片a | 伊人狠狠干 | 婷婷亚洲一区 | 香蕉视频色版 | 亚洲精品久久夜色撩人男男小说 | 在线免费看mv的网站入口 | 99国产精品白浆在线观看免费 | 96久久久| 成年丰满熟妇午夜免费视频 | 亚洲性夜 | 插插久久| 亚洲经典av | 国产第十页 | 中文字幕乱码一区 | 亚洲天堂一区二区在线 | 丝袜国产视频 | 国产精品国语自产拍在线观看 | 国产一区二区三区四区五区 | 相亲对象是问题学生动漫免费观看 | 亚洲第五页 | 国产精品一 | 欧美一级网址 | 黄色大片在线播放 |