03Prism WPF 入门实战 - Region

1.概要

源码及PPT地址:https://github.com/JusterZhu/wemail

视频地址:https://www.bilibili.com/video/BV1KQ4y1C7tg?sharesource=copyweb

(1)Prism概览

ac9913d4f18d35897785cd9067e6303d.png

  • Application:我们开发应用程序,初始化Bootstrapper。

  • Bootstrapper:是用来初始化应用程序级别的组件和服务,它也被用来配置和初始化module catalog和Shell 的View和View Model。

  • Modules:是能够独立开发、测试、部署的功能单元,Modules可以被设计成实现特定业务逻辑的模块(如Profile Management),也可以被设计成实现通用基础设施或服务的模块。

  • Shell是宿主应用程序(host application),modules将会被load到Shell中。Shell定义了应用程序的整体布局和结构,而不关心寄宿其中的Module,Shell通常实现通用的application service和infrastructure,而应用的逻辑则实现在具体的Module中,同时,Shell也提供了应用程序的顶层窗口。

  • Services:是用来实现非UI相关功能的逻辑,例如logging、exception management、data access。Services可以被定义在应用程序中或者是Module中,Services通常被注册在依赖注入容器中,使得其它的组件可以很容易的定位这个服务。

  • Container:注入服务、其他模块依赖。

111b4362f62dfda1fe34ecc99ab857a6.png

7e99e2998e33186f1f2c0169f221801a.png

(2)Region

  • Region是应用程序UI的逻辑区域(具体的表现为容器控件),Views在Region中展现,很多种控件可以被用作Region:ContentControl、ItemsControl、ListBox、TabControl。Views能在Regions编程或者自动呈现,Prism也提供了Region导航的支持。这么设计主要为了解耦让内容显示灵活具有多样性。

83ce1254a99da972fffe606bd21e6f01.png

在实战项目当中,需根据业务需求来划分Region。

ee856d9edbbffd98e02cbab30c0de05c.png

(3)RegionManager

RegionManager主要实现维护区域集合、提供对区域的访问、合成视图、区域导航、定义区域。

区域定义方式有两种:

  • Xaml实现

    <ContentControl x:Name=“ContentCtrl” prism:RegionManager.RegionName="ContentRegion" />
  • C#实现

    RegionManager.SetRegionName(ContentCtrl,”ContentRegion”);public MainWindowViewModel(IRegionManager regionManager)
    {_regionManager = regionManager;_regionManager.RegisterViewWithRegion("ContentRegion", typeof(MainWindow));
    }

(4)RegionAdapter

RegionAdapter(区域适配)主要作用为特定的控件创建相应的Region,并将控件与Region进行绑定,然后为Region添加一些行为。

因为并不是所有的控件都可以作为Region的,需要为需要定义为Region的控件添加RegionAdapter。一个RegionAdapter需要实现IRegionAdapter接口,如果你需要自定义一个RegionAdapter,可以通过继承RegionAdapterBase类来省去一些工作。

Prism为开发者提供了几个默认RegionAdapter:

  • ContentControlRegionAdapter:创建一个SingleActiveRegion并将其与ContentControl绑定

  • ItemsControlRegionAdapter:创建一个AllActiveRegion并将其与ItemsControl绑定

  • SelectorRegionAdapter:创建一个Region并将其与Selector绑定

  • TabControlRegionAdapter:创建一个Region并将其与TabControl绑定

2.详细内容

Region和RegionManager实战应用。

d28b6e5310e2a37511063679c7656c0f.png

(1)定义Region及选择好容器控件

<TabControl prism:RegionManager.RegionName="TabRegion" />

(2)ViewModel注册视图到TabRegion当中 public class MainWindowViewModel : BindableBase { //Region管理对象 private IRegionManager _regionManager; private string _title = "Prism Application";

public string Title{get { return _title; }set { SetProperty(ref _title, value); }}public MainWindowViewModel(IRegionManager regionManager){//Prism框架内依赖注入的RegionManager_regionManager = regionManager;//在ContentRegion中注册视图TempView(TabItem1)_regionManager.RegisterViewWithRegion("TabRegion", typeof(TempView));//TabItem2_regionManager.RegisterViewWithRegion("TabRegion", typeof(Temp2View));//TabItem3_regionManager.RegisterViewWithRegion("WorkRegion", typeof(Temp3View));//对视图的访问、操作//var contentRegion = _regionManager.Regions["ContentRegion"];//contentRegion.Context//contentRegion.Remove()//contentRegion.Activate()//foreach (var item in contentRegion.ActiveViews)//{//    contentRegion.Activate(item);//}}
}

f3127a73750c1f2daca8e500910b4fc1.png

RegionAdapter实战应用。

如果在实际开发工作当中遇到了特殊场景需要而Prism并没有设置对应的RegionAdapter。这时候可以通过继承实现RegionAdapterBase内置对象来扩展一个新的RegionAdapter。

(1)实现一个新的RegionAdapter
/// <summary>
/// custom region adapter.
/// </summary>
public class StackPanelRegionAdapter : RegionAdapterBase<StackPanel>
{public StackPanelRegionAdapter(IRegionBehaviorFactory regionBehaviorFactory) : base(regionBehaviorFactory){}protected override void Adapt(IRegion region, StackPanel regionTarget){//该事件监听往StackPanel添加view时的操作region.Views.CollectionChanged += (sender, e) =>{//监听到增加操作时则往StackPanel添加Children,枚举出来的操作在后面一段代码中体现if (e.Action == System.Collections.Specialized.NotifyCollectionChangedAction.Add){regionTarget.Children.Clear();foreach (var item in e.NewItems){regionTarget.Children.Add(item as UIElement);}}};}protected override IRegion CreateRegion(){return new Region();}
}// Summary:
//     Describes the action that caused a System.Collections.Specialized.INotifyCollectionChanged.CollectionChanged
//     event.
public enum NotifyCollectionChangedAction
{//// Summary://     An item was added to the collection.Add,//// Summary://     An item was removed from the collection.Remove,//// Summary://     An item was replaced in the collection.Replace,//// Summary://     An item was moved within the collection.Move,//// Summary://     The contents of the collection changed dramatically.Reset
}

(2)在App.cs文件中注册新的RegionAdapter

public partial class App
{/// <summary>/// 应用程序启动时创建Shell/// </summary>/// <returns></returns>protected override Window CreateShell(){return Container.Resolve<MainWindow>();}protected override void RegisterTypes(IContainerRegistry containerRegistry){}/// <summary>/// 配置区域适配/// </summary>/// <param name="regionAdapterMappings"></param>protected override void ConfigureRegionAdapterMappings(RegionAdapterMappings regionAdapterMappings){base.ConfigureRegionAdapterMappings(regionAdapterMappings);//添加自定义区域适配对象,会自动适配标记上prism:RegionManager.RegionName的容器控件为RegionregionAdapterMappings.RegisterMapping(typeof(StackPanel), Container.Resolve<StackPanelRegionAdapter>());}
}

(3)在xaml中使用

<StackPanel prism:RegionManager.RegionName="StackPanelRegion"></StackPanel>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/296530.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

10月Web服务器调查:Apache下降 Ngnix攀升

来自netcraft的消息&#xff0c;在2010年10月份的Web服务器市场调查中&#xff0c;在232,839,963个网站中&#xff0c;仍有69.8%的站点在使用 Apache服务器&#xff0c;相比于上个月&#xff0c;其市场份额增长了大约1个百分点&#xff0c;Ngnix也有较小幅度的增长&#xff0c;…

Python深度学习029:pytorch中常用的模块或方法

PyTorch是一个广泛使用的深度学习库,提供了许多用于构建和训练神经网络的模块和方法。下面是一些PyTorch中常用的模块和方法的简要介绍: PyTorch常用模块和方法 torch 用途:PyTorch的基础模块,提供了多种数学运算功能。常用方法: torch.tensor():创建张量torch.randn():…

【转载】Android设计中的.9.png

转载自&#xff1a;腾讯ISUX (http://isux.tencent.com/android-ui-9-png.html) 在Android的设计过程中&#xff0c;为了适配不同的手机分辨率&#xff0c;图片大多需要拉伸或者压缩&#xff0c;这样就出现了可以任意调整大小的一种图片格式“.9.png”。这种图片是用于Android开…

如果你没空看书,我强烈建议你做这件事!

知乎上有个高赞问题&#xff1a;有哪些书看完后&#xff0c;会让人后悔没早看到&#xff1f;答案各有不一、包罗万象。但有一点&#xff0c;大家达成了共识&#xff1a;要多读书。人生漫长&#xff0c;而我们都不会是一成不变的&#xff0c;真正决定人与人之间的差距的&#xf…

为什么应该在业务层实现管道模式,而不用ASP.NET Core Middleware实现 | 2点原因和实现方式...

前言ASP.NET Core的Middleware&#xff08;中间件&#xff09;就是使用了管道模式&#xff1a;Request&#xff08;请求&#xff09;在管道中传递&#xff0c;依次经过管道中的每一个MiddleWare进行处理。MiddleWare就像一层层的“滤网”&#xff0c;过滤所有的请求和响应。这种…

缓存在哪里_什么是MyBatis缓存技术

MyBatis缓存引言在一个Web项目中&#xff0c;查询数据库中的操作算是一个非常常用的操作&#xff0c;但是有些数据会被经常性的查询&#xff0c;而每一次都去数据库中查询这些重复的数据&#xff0c;会很消耗数据库的资源&#xff0c;同时使得查询效率也很低&#xff0c;而 MyB…

WPF开发登录窗口之——窗口布局

WPF开发者QQ群&#xff1a; 340500857 | 微信群 -> 进入公众号主页 加入组织01—代码如下一、创建项目&#xff0c;命名为LoginWindow&#xff0c;然后创建以下目录结构&#xff1a;二、导入图片三、创建资源字典。一共创建四个&#xff1a;ButtonStyle、WindowStyle、Text…

这个偏僻的小山村竟出了12位博士28位硕士,高产“学霸”背后原因曝光......

全世界只有3.14 % 的人关注了爆炸吧知识考上大学留名祖宗祠堂今早&#xff0c;超模君刷微博的时候&#xff0c;有一则新闻吓得我虎躯一震——一个总共才2000多人小山村&#xff0c;竟然出了12位博士28位硕士。而且考上大学的孩子&#xff0c;他们的名字直接刻进祖宗祠堂。(微博…

牛顿新定律:凭本事得到的,凭什么要还?

后记事后&#xff0c;超模君提出用上帝开过光的真苹果来换回自己的苹果手机&#xff0c;但是惨遭牛顿君拒绝&#xff0c;理由是苹果手机更能激发他的创作灵感……面对这种鬼话&#xff0c;超模君敢怒不敢言。更惨的是&#xff0c;上帝说苹果手机不报销……艾萨克牛顿&#xff0…

04Prism WPF 入门实战 - Module

1.概要源码及PPT地址&#xff1a;https://github.com/JusterZhu/wemail视频地址&#xff1a;https://www.bilibili.com/video/BV1KQ4y1C7tg?sharesourcecopywebModule&#xff0c;具有特定功能&#xff0c;且独立存在则称为成为模块。下图为Prism体系中的关系结构图。在Prism体…

虚拟机(VMware Workstation)中,把连接网络的模式由“NAT模式”,改成“自动桥接模式”,网速大大的提升...

安装虚拟机&#xff0c;默认情况下&#xff0c;联网的模式是NAT&#xff0c;即跟主机是转发共用网络资源的&#xff0c;这样就非常慢&#xff0c;时常网页都打不开&#xff0c;现把它改成桥接模式&#xff0c;让它独立成为一台物理机&#xff0c;网速有大大的改善&#xff0c;设…

如何保持纯洁男女关系……

1 倒也没毛病▼2 差点以为是狗子&#xff01;&#xff01;▼3 大哥&#xff1a;我裤子没破&#xff01;▼4 女朋友梦到了啥&#xff1f;&#xff1f;▼5 忍不住了&#xff0c;嘻嘻嘻...&#xff08;via.小风车车&#xff09;▼6 亲爸爸&#xff01;&#xff01;▼7 哈哈哈…

【转】一个关于fork()的笔试题,考了好几遍,终于找到答案了

笔试至少3次见到这个题&#xff0c;都是瞎编的&#xff0c;今天群里有人问&#xff0c;然后有人放出了这个地址&#xff1a;http://coolshell.cn/articles/7965.html&#xff0c;让我恍然大明白&#xff0c;豁然好脾气。 感谢这位陈皓同学&#xff08;名字很熟&#xff0c;不记…

C# 选中 DataGridView 控件中的行时显示不同的颜色

可以利用 DataGridView 控件的 SelectionMode、ReadOnly 和 SelectionBackColor 属性实现当选中DataGridView控件中的行时显示不同的颜色。SelectionMode属性用于设置如何选择 DataGridView 的单元格。语法如下:public DataGridViewSelectionMode SelectionMode{get;set;}属性值…

32岁武汉硕士毕业4年后重新高考,考上本硕需再读8年:“不是一时冲动”

全世界只有3.14 % 的人关注了爆炸吧知识9月5日&#xff0c;程传坤收到了湖北中医药大学的录取通知书。7月8日下午5时10分&#xff0c;32岁的程传坤走出湖北省武汉市新洲一中考点&#xff0c;一脸轻松&#xff0c;拿着准考证特意在新洲一中门前留影。这是他硕士毕业4年后再战高考…

打开本地文件_可以跨软件搜索文件?结构式检索你一定要学会!

面对电脑中日积月累的大量结构式&#xff0c;如何能快速找到自己想要的文件&#xff0c;有时真是一个让人头疼的问题。KingDraw PC版内置的结构式检索功能&#xff0c;可以帮助我们轻松解决这个难题。KingDraw PC版中&#xff0c;我们有两种途径可以检索结构式——右键菜单中检…

WPF实现雷达图(仿英雄联盟)

WPF开发者QQ群&#xff1a; 340500857 | 微信群 -> 进入公众号主页 加入组织转载 有小伙伴提出需要实现雷达图。 由于在WPF中没有现成的雷达图控件&#xff0c;所以我们自己实现一个。PS&#xff1a;有更好的方式欢迎推荐。01—代码如…

python3 2.00gb怎么去掉单位_最值得期待的Python 3.9的新功能

Python 3.9 beta预计下个月就要发布了&#xff0c;那么3.9有那些让我们期待的新功能和变更呢&#xff1f;本我我们一起来说Python 3.9的新功能的。安装测试版为了能够实际探索Python 3.9 的功能&#xff0c;我们需要先下载一个Python 3.9 alpha/beta并安装。wget https://www.p…

这6部超经典的物理电影,居然还有人没有看过?

全世界只有3.14 % 的人关注了爆炸吧知识开篇警告&#xff1a;这是一篇福利文&#xff01;今天小编给热爱物理及数学的小伙伴们&#xff0c;分享6部豆瓣评分8分以上&#xff0c;与数学和物理领域相关的经典电影&#xff0c;帮助大家在工作、学习之余劳逸结合。这些影片除了涉及数…

产品说,我只需要一个有亿点复杂的查询界面

有的时候&#xff0c;你需要动态构建一个比较复杂的查询条件&#xff0c;传入数据库中进行查询。而条件本身可能来自前端请求或者配置文件。那么这个时候&#xff0c;表达式树&#xff0c;就可以帮助到你。本文我们将通过几个简短的示例来了解如何完成这些操作。你也可能接到过…