Prism区域管理器IRegionManager用法介绍

概要

本文主要介绍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用法介绍的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • WPF框架Prism中模块Module用法

    什么是模块(Module)? 本质上来说, 对于一个应用程序而言, 特定功能的所有View.Logic.Service等都可以独立存在.那么意味着, 每个独立的功能我们都可以称之为模块.而往往实际上, 我们在一个项目当中, 他的结构通常是如下所示: 所有的模块都在一个项目当中, 这使得应用程序当中, 我们难以区分单独的模块, 它们似乎变成了一个整体. 所以,当我们开始考虑划分模块之间的关系的时候, 并且采用新的模块化解决方案, 它的结构将变成如下所示: 该项目包含了一个启动页, 并且在启动页当中

  • 为WPF框架Prism注册Nlog日志服务

    无论是Nlog还是Serilog, 它们都提供了如何快速在各类应用程序当中的快速使用方法. 尽管,你现在无论是在WPF或者ASP.NET Core当中, 都可以使用ServiceCollection来做到着一点, 因为日志框架都提供了IServiceCollection的扩展. 但是, 如果现在你使用的是Prism 8.0的应用程序, Prism提供了多种容器的支持, 例如:DryIoc或者Unity, 这个时候我们如果现在这个基础上实现依赖注入,首先我们需要修改Prism当中创建容器的默认实现

  • WPF框架Prism中对话框Dialog用法介绍

    什么是Dialog? 对话框实际上是我们应用程序经常用到的一个功能, 类如: Show.ShowDialog. 可以弹出一个我们指定的窗口, 仅此而已, 那么在Prism当中, Dialog指的是什么? Prism提供了一组对话服务, 封装了常用的对话框组件的功能, 例如: RegisterDialog/IDialogService (注册对话及使用对话) 打开对话框传递参数/关闭对话框返回参数 回调通知对话结果 创建Dialog流程 创建对话框,通常是一组用户控件 ,并且实现 IDialogA

  • WPF框架Prism中导航Navigation用法介绍

    使用场景 在普遍的业务场景当中, 必不可少的是页面切换, 而Prism就可以使用Navigation功能来进行页面导航, 在不同的场景当中会有各种用法, 例如在切换页面验证.传递参数.返回上一页.返回下一页等功能. 导航的基本条件 1.注册显示区域 2.注册导航页面 1.注册导航 注册视图类型或添加别名, 如果为指定别名,名称默认为当中类型的名称 public class ModuleAModule : IModule { public void OnInitialized(IContainer

  • WPF框架Prism中ViewModelLocator用法介绍

    建立连接 在WPF当中,需要为View与ViewModel建立连接, 我们需要找到View的DataContext, 如下所示: 建立连接的方式 如果你使用了解WPF当中如何绑定DataContext, 你应该能想到会有下面这些方式进行: XAML设置 Code设置 (构造函数注入 或 ViewModelLocator) XAML的方式: <UserControl.DataContext> <.../> </UserControl.DataContext> 代码的方式:

  • WPF框架Prism中使用MVVM架构

    常见的MVVM框架 众所周知, 如果你了解WPF当中的ICommand, INotifyPropertyChanged的作用, 就会发现众多框架都是基于这些进行扩展, 实现其通知.绑定.命令等功能. 对于不同的MVVM框架而言, 大体使用上会在声明方式上的差异, 以及特定功能上的差别. 下面列举了常用的3个MVVM框架,他们的一些差异.如下所示: 功能↓ / →框架名 Prism Mvvmlight Micorosoft.Toolkit.Mvvm 通知 BindableBase ViewMode

  • WPF框架之Prism介绍

    什么是Prism? Prism是一个用于在 WPF.Xamarin Form.Uno 平台和 WinUI 中构建松散耦合.可维护和可测试的 XAML 应用程序框架. Prism历史 他最初由Microsoft Patterns & Practices 团队构建的项目, 目的是帮助WPF开发人员以简化编写.维护和扩展来设计应用程序.目前它是属于.NET基金会下的一个开源项目.并且经过财富100强等公司的多年的实践考验. Github https://github.com/PrismLibrary/

  • WPF框架Prism中区域Region用法介绍

    什么是区域(Region)? 在理解这个之前, 首先需要了解一下, 在最常见的开发模式当中, 我们去设计某个页面的时候, 实际上界面元素在设计的时候已经被固定. 举个简单的例子,当我们去设计如下页面, 它包含Header.Menu.Content内容. 因此我们可以为这个页面设计一些元素, 例如: 1.Menu 可以放置ListBox 2.Content 可以放置一个ContentControl 3.Header 可以放置一些ToolBar 注:为了演示需要, 对应区域的控件均采用TextBlo

  • WPF创建Prism应用程序

    创建Prism应用程序 1.第一步 首先, 创建一个基于.NetFramework 或.NetCore的WPF应用程序.如下所示: 2.第二步 为当前应用程序添加NuGet源, 打开NuGet管理器,安装Prism.DryIoc, 如下所示: 说明: 本文将以DryIoc容器为主讲解本系列的所有内容. 实际上, 在Prism7.2版本中, 已经引入了一些围绕IOC抽象的API更改.这最终将使得在选择容器之间切换更加容易,因为 API 在如何注册服务和视图方面完全相同. 您仍然可以访问容器,在 A

  • WPF框架Prism中View Injection用法介绍

    View View通常指的是, 我们定义的页面, 而在模块化的系统当中, 我们往往称之为用户控件(UserControl).对于模块化系统而言, 每个模块当中都有N个用户控件组成, 然后模块向区域当中注册视图. View Injection 在介绍Region章节当中所讲到, RegionManager的功能: 维护区域集合 提供对区域的访问 合成视图 区域导航 定义区域 这意味着, 我们可以在模块当中为区域指定视图, 这个时候,我们就可以通过依赖注入的方式,使用IRegionManager接口

随机推荐