首页 > 其他分享 >Prism区域和模块化(Region & Module)

Prism区域和模块化(Region & Module)

时间:2023-09-03 16:00:32浏览次数:41  
标签:控件 适配器 Module Prism 区域 模块 Region

Prism 一直是围绕依赖注入构建的。这有助于您构建可维护和可测试的应用程序,并帮助您减少或消除对静态和循环引用的依赖。

Prism区域概念(Region)

什么是区域(Region)

区域(Region)作为Prism当中模块化的核心功能,其主要目的是弱化了模块与模块之间的耦合关系。在普遍的应用程序开发中,界面上的元素及内容往往被固定。如下图所示:假设应用程序包含Header、Menu、Content内容

因此我们可以为这个页面设计一些元素,例如:

Menu可以设置ListBox;
Content可以放置一个ContentControl;
Header可以放置一些ToolBar; 

prism中,可以不再为其固定内容,从而有了区域的概念;现在,将页面每个部分定于一个唯一区域(Region),那么在运行时,我们可以对每个区域动态设置内容。

定义Region方式(RegionManager)

Prism给出的额区域定义有两种方式:
RegionManager.RegionName(XAML)
RegionManager.SetRegionName(Code) 

第一种:在XAML中定义Region 

运行结果如下所示: 

第二种:在Code中定义Region

RegionManager除了定义区域,还有以下功能:

  • 维护区域集合 public IRegionCollection Regions
  • 提供对区域的访问 regionManager.Regions["Content"];
  • 合成视图 View Composition
  • 区域导航 Region Navigation
  • 定义区域 

区域适配器(RegionAdapter)

实际上,Prism内置了几个区域适配器,所以我们可以在ContentControl当中定义区域,实际可以在任何元素上定义区域,如果定义的范围不在官方提供的默认适配器当中,则会引发异常。

官方提供的适配器类型: 

  • ContentControlRegionAdapter 此适配器适应类型 System.Windows.Controls.ContentControl 和派生类的控件,例如 ContentControl 。
  • SelectorRegionAdapter 该适配器适配从类派生的控件 System.Windows.Controls.Primitives.Selector ,例如 TabControl 控件。
  • ItemsControlRegionAdapter 此适配器适应类型 System.Windows.Controls.ItemsControl 和派生类的控件,例如 Toolbar/Ribbon 控件。

对于如StackPanel等其他控件,区域适配器需要自己编写,编写过程如下:

Prism模块化概念(Module)

什么是模块(Module)

本质上来说,对于一个应用程序而言,特定的所有View、Logic、Service等都可以独立存在。那么意味着,每个独立的功能我们都可以称之为模块。而往往实际上,我们在一个项目当中,他的结构通常是如下所示

所有的模块都在一个项目当中,这使得应用程序当中,我们难以区分单独的模块,他们似乎变成了一个整体。

当我们开始考虑划分模块之间的关系时,采用新的模块化解决方案,他的结构将变成如下所示:

创建模块实例

创建Module实际上是将模块独立与类库存在,模块实现IModule接口,主程序通过加载类库添加模块。以下步骤:

模块生命周期

Prism 中的模块加载过程包括以下顺序:

  • 注册模块(Registering modules) 是通过在类内部实现 IModule 接口来创建的。
  • 发现模块(Discovering modules) 在运行时为特定应用程序加载的模块在模块目录中定义。目录包含有关要加载的模块的信息,例如它们的位置和加载顺序。
  • 加载模块(Loading modules) 包含模块的程序集被加载到内存中。
  • 初始化模块(Initializing modules) 这意味着创建模块类的实例,通过 IModule 接口调用它们的 RegisterTypes 和 OnInitialized 方法,完成模块初始化。 

主程序配置模块目录的方式

  • Code(代码方式)
  • App.config(配置文件)
  • Disk/Directorty(磁盘路径)
  • XAML(XAML定义) 

视图注入(View Injection) 

应用程序模块加载后,每个子模块中的视图可以独立的进行依赖注入。再使用IRegionManager来实现页面导航。

1.利用Region进行导航功能。
2.使用Module将应用程序模块化(若无模块化,则不需要)。
3.将独立模块的视图、服务使用注入到容器中。

依赖注入(Dependency Injection)

Prism项目中的 App 继承于 PrismApplication ,必须要重写 CreateShell() 和 RegisterTypes() 方法,其中 RegisterTypes()用于依赖注入容器,该函数使用 IContainerRegistry 类型的对象将用户自定义的对象注入容器。

依赖注入的几种方法:

  • Register:每一次解析都会创建一个实例
  • RegisterInstance:将一个服务实例注册到容器中
  • RegisterSingleton :整个应用程序生命周期以内只创建一个实例(单例)

标签:控件,适配器,Module,Prism,区域,模块,Region
From: https://www.cnblogs.com/ZHIZRL/p/17675080.html

相关文章

  • PrismMVVM功能实现(通知、命令)
    常见的MVVM框架,基本围绕ICommand、INotifyPropertyChanged的封装实现绑定、通知等功能;而对于不同框架,在实现相同功能上,只是表现的形式有所不同,下图列举几种常见框架的功能区别:功能\框架PrismMVVMLightMicorsoft.Tookit.Mvvm通知BindableBaseViewModelBaseObservableO......
  • Prism项目初始化与项目结构
    Prism简介Prism框架适用于WPF和XamarinForms中构建松散耦合、可维护和可测试的应用程序。Prism提供了一组设计模式的实现,这些设计模式有助于编写结构良好且可维护的xaml应用程序,功能包括:视图模型定位器(ViewModelLocation)MVVM(通知)命令(Commands)事件聚合器(EventAggr......
  • Prism视图模型定位器(ViewModelLocator)
    视图模型定位器(ViewModelLocator)依照“标准命名约定”将视图(View)中的数据上下文链接到视图模型(ViewModel)的实例。自动绑定视图模型Prism视图模型定位器(ViewModelLocator)有一个AutoWireViewModel属性:当设置为true时,AutoWireViewModelChanged事件调用类中的ViewMod......
  • The 2021 ICPC Asia Shenyang Regional Contest 解题报告
    The2021ICPCAsiaShenyangRegionalContestsolo七题罚时738打到金尾了,但是这个G和I也应该是自己能做出来的。G找了若干性质确实转化到最后一步了。但本应该搞出的dp没有想到。G和M感觉都有点降智。而I则是被复数吓到了。有点菜。B:拆位,扩展域并查集。E:签到。F......
  • ModuleNotFoundError: No module named 'flask._compat’
    原因:flask版本过高,flask里面的._compat.py文件没有;解决方案1:解决:降低flask版本,1.1.2即可pipinstallflask==1.1.2 解决方案2:更改flask_script文件,Ctrl+左键 进入到flask_script的 __init__.py 源码文件中,将 fromflask._compatimporttext_type 语句改成 fromf......
  • The 2022 ICPC Asia Xian Regional Contest
    链接C.CloneRanran题意:一个人要准备一场比赛,需要出c道题,他现在可以选择两种操作:1.花费a分钟自我复制一次。(复制的自己也可以接着复制)2.花费b分钟出一道题。问最短要多少分钟可以准备c道题。思路:枚举自我复制的次数,挨个判断就行。#include<bits/stdc++.h>usingnamespaces......
  • The 2022 ICPC Asia Nanjing Regional Contest (G. Inscryption)
    Problem-G-Codeforces反悔贪心#include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;#defineendl"\n"constintN=1e6+5;inlineintgcd(inta,intb){returnb>0?gcd(b,a%b):a;}intmain(){ios::......
  • The 2022 ICPC Asia Nanjing Regional Contest(A.Stop, Yesterday Please No More)
    模拟边界(不是袋鼠)移动,通过二维差分维护左上角和右下角,同时注意排除重复的点#include<bits/stdc++.h>usingnamespacestd;#defineendl"\n"typedeflonglongll;constintN=1e3+5;intf[N][N];intmain(){ios::sync_with_stdio(false),cin.tie(0),cout.......
  • Prism对话框之自定义DialogWindow
    Prism对话框之自定义DialogWindow1.自定义DialogWindow窗体样式(1)定义DialogWindow窗体类,注意要实现IDialogWindow///<summary>///CustomDialogWindow.xaml的交互逻辑///</summary>publicpartialclassCustomDialogWindow:Window,IDialogWindow{publicIDi......
  • 【python】使用ddddocr模块报错处理:AttributeError: module 'PIL.Image' has no attri
    安装pipinstallddddocr安装特别慢,几kb每秒,而且容易超时报错使用清华源下载:pipinstall-ihttps://pypi.tuna.tsinghua.edu.cn/simpleddddocr使用img_url="https://user.wangxiao.cn/apis//common/getImageCaptcha"img_resp=session.post(img_url)......