最新要闻
- 不愧是宝马 因机油渗漏:近500台S1000系列摩托车被召回
- 焦点日报:肾脏衰竭 球王贝利病情继续恶化:家人开始筹备葬礼
- 当前头条:喜提安卓13!小米平板5/Pro 12.4推送MIUI 14开发版:支持光子引擎
- 每日热文:SSD/内存白菜价难持续:国产厂商被制裁 三星等大厂减产提价
- AMD RX7900被吐槽空气卡 溢价千元普遍:国内用户持币等 买它还是4080?
- 【世界播资讯】小米又一爆款诞生!小米净水器销量破500万台
- 热推荐:新冠后丧失嗅觉的关键原因找到了 科学家:长期失灵也能恢复
- 环球通讯!3199元起 爱奇艺奇遇MIX VR一体机发布:4K级3000吋巨幕 支持Steam串流
- 焦点快播:趁早加满!下轮国内油价上调几成定局
- 影驰发布全球第三款8GHz DDR5内存:如此"光污染" 绝了
- 焦点速讯:电解质水到底有没有用?我来告诉你
- 美国人预期寿命降至25年来最低:三大因素导致一半的死亡
- 11月智能手机销量出炉:小米大卖340万台 国产第一
- 今日最新!东京奥运会陷入丑闻:审计人员发现实际成本高出20%
- 经典大富翁游戏《富甲天下3》登陆Steam 2023年1月9日发售
- 全球速看:美国“毅力号”在火星上丢了个东西:意义重大
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
WPF开发之Prism详解【内附源码】
在实际应用开发中,随着项目业务逐渐复杂,耦合度会越来越高,维护成本也会直线上升,所以解耦也变得越来越重要。Prism框架为WPF开发中解耦提供了非常便捷的应用。今天主要以一个简单的小例子,简述WPF开发中Prism框架的简单应用,如有不足之处,还请指正。
(相关资料图)
什么是Prism?
Prism是一个开源框架,用于在WPF、Xamarin Forms、Uno/Win UI等应用中创建松耦合、可维护、可测试的XAML应用程序。Prism提供了一组设计模式的实现,这些设计模式有助于编写结构良好且可维护的XAML应用程序,包括MVVM,dependency injection,commands,EventAggregator等。
Prism源码库
Prism遵守开源许可协议(MIT),目前最新版本8.1.97,可通过GitHub进行下载最新版本。https://github.com/PrismLibrary
Prism优点
Prism 设计围绕核心建筑设计原则,即关注点分离和松散耦合。这使得Prism可以提供许多好处
重复使用:通过重复使用单元测试的组件,可以通过依赖性注入在运行时间轻松发现和集成,以及通过使用可在应用程序中重复使用的应用程序级功能封装模块,在应用级别实现重复使用。
可扩展性:通过管理组件依赖性、使组件在运行时间更容易集成或替换为替代实现以及提供将应用程序分解为可独立更新和部署的模块的能力,帮助创建易于扩展的应用程序
灵活性:Prism有助于创建灵活的应用程序,使它们能够随着新功能的开发和集成而更容易更新
团队发展:Prism有助于最大限度地减少跨团队依赖性,并允许团队专注于不同的功能领域(如UI设计、业务逻辑实现和基础架构代码开发),或不同业务级别的功能领域(如简介、销售、库存或物流)。
模块化思想
通过对比发现,采用模块化思想进行设计,使得程序结构清晰,符合高内聚,低耦合的设计风格。
Prism安装
Prism可通过NuGet方案包管理器进行安装,主要安装三个Prism.Core,Prism.Unity,Prism.Wpf
创建模块和视图控件
创建WPF类库,并添加用户控件视图,并采用MVVM开发模式
数据绑定
在Prism框架中,提供了数据绑定基类Prism.Mvvm.BindableBase,可以方便的将普通属性,转换为依赖属性,简化开发中过程中的代码量。
1 namespace DemoPrism.Second.ViewModels 2 { 3 internal class SecondViewModel : BindableBase 4 { 5 #region 属性及构造函数 6 7 private int id; 8 9 public int Id10 {11 get { return id; }12 set { SetProperty(ref id, value); }13 }14 15 ///16 /// 模块间交互17 /// 18 private readonly IEventAggregator eventAggregator;19 20 public SecondViewModel(IEventAggregator eventAggregator)21 {22 this.eventAggregator = eventAggregator;23 this.eventAggregator.GetEvent().Subscribe(DemoOneRecived);24 }25 #endregion26 private void DemoOneRecived(int id)27 {28 this.Id = id;29 }30 }31 }
创建Prism模块
添加Module类,并实现Prism.Modularity.IModule接口,实现接口的模块,视为可以被Prism发现并加载的模块。以DefectListModule模块为例:
1 namespace DemoPrism.First 2 { 3 public class FirstModule : IModule 4 { 5 public void OnInitialized(IContainerProvider containerProvider) 6 { 7 IRegionManager regionManager = containerProvider.Resolve(); 8 regionManager.RegisterViewWithRegion("FirstRegion", typeof(Views.FirstView)); 9 }10 11 public void RegisterTypes(IContainerRegistry containerRegistry)12 {13 containerRegistry.RegisterForNavigation ();14 }15 }16 }
模块配置
Prism提供了多种模块加载方式,常用的有App.config配置文件方法。
在App.config节点,添加configSections配置,增加modules节点配置
modules节点主要配置需要加载的Prism模块
1 23 4 5 6 78 9 1210 11
模块加载
模块配置好后,需要在启动的时候,加载模块。修改WPF入口启动程序,App.xaml.cs文件,继承自Prism.Unity.PrismApplication基类,并重写相关初始化
1 namespace DemoPrism 2 { 3 ///4 /// Interaction logic for App.xaml 5 /// 6 public partial class App : PrismApplication 7 { 8 //使用容器创建主窗体 9 protected override Window CreateShell() => Container.Resolve();10 11 12 protected override void ConfigureViewModelLocator()13 {14 base.ConfigureViewModelLocator();15 }16 17 protected override void ConfigureModuleCatalog(IModuleCatalog moduleCatalog)18 {19 //通过代码的方式添加模块20 //moduleCatalog.AddModule ();21 //将MedicineModule模块设置为按需加载22 base.ConfigureModuleCatalog(moduleCatalog);23 }24 25 protected override void RegisterTypes(IContainerRegistry containerRegistry)26 {27 28 }29 30 31 protected override IModuleCatalog CreateModuleCatalog()32 {33 ConfigurationModuleCatalog configurationModuleCatalog = new ConfigurationModuleCatalog();34 configurationModuleCatalog.Load();35 36 //通过Xaml配置文件读取模块加载信息37 38 return configurationModuleCatalog;39 //return directoryModuleCatalog;40 }41 42 /// 43 /// 注册适配器(区域容器:Region)44 /// 45 /// 46 protected override void ConfigureRegionAdapterMappings(RegionAdapterMappings regionAdapterMappings)47 {48 base.ConfigureRegionAdapterMappings(regionAdapterMappings);49 }50 }51 }
区域Region
在Prism框架中,模块可以注册到导航菜单Navigation,也可以注册到区域Region,根据实际业务需要进行选择。Region可以更加方便的进行模块化布局等。在普通容器控件中,增加prism:RegionManager.RegionName=”名称”
111 12 1913 1614 15 17 18
模块交互
模块与模块之间相互独立,如果需要交互,可以通过事件聚合器IEventAggregator,采用事件的订阅和发布进行通信。
事件订阅步骤:
定义事件,定义一个类,继承自Prism.Events.PubSubEvent泛型类
事件发布,通过事件聚合器的Publish方法进行发布。
事件订阅,通过事件聚合器的Subscribe进行订阅。
1 namespace DemoPrism.Event 2 { 3 ///4 /// 注册事件 5 /// 6 public class DemoOneEvent : PubSubEvent7 { 8 9 }10 }
弹出模态窗口
在Prism框架下,弹出模态窗口,需要以下3个步骤:
在Prism框架中,页面UserControl实现弹窗功能,被弹出页面需要实现Prism.Services.Dialogs.IDialogAware接口。
注册窗口,将UserControl注册成窗口。
调用弹出服务,弹出窗口
源码下载
示例中源码下载,在公众号恢复关键词PRISM,如下所示:
学习编程,从关注【老码识途】开始!!!
-
最新快讯!Codeforces 1097 G Vladislav and a Great Legend 题解 (DP)
题目链接思路首先看到这种求$x^k$形式的,直接无脑转下降幂:$x^k= sum_{i=1}^kS2(k,i) cdotx^{ ...
来源: WPF开发之Prism详解【内附源码】
不愧是宝马 因机油渗漏:近500台S1000系列摩托车被召回
最新快讯!Codeforces 1097 G Vladislav and a Great Legend 题解 (DP)
焦点日报:肾脏衰竭 球王贝利病情继续恶化:家人开始筹备葬礼
02.关于线程你必须知道的8个问题(上)
当前头条:喜提安卓13!小米平板5/Pro 12.4推送MIUI 14开发版:支持光子引擎
每日热文:SSD/内存白菜价难持续:国产厂商被制裁 三星等大厂减产提价
天天热点!我的2022年个人总结
环球焦点!FreeSWITCH学习笔记:EventSocket
AMD RX7900被吐槽空气卡 溢价千元普遍:国内用户持币等 买它还是4080?
【世界播资讯】小米又一爆款诞生!小米净水器销量破500万台
热推荐:新冠后丧失嗅觉的关键原因找到了 科学家:长期失灵也能恢复
环球通讯!3199元起 爱奇艺奇遇MIX VR一体机发布:4K级3000吋巨幕 支持Steam串流
焦点快播:趁早加满!下轮国内油价上调几成定局
影驰发布全球第三款8GHz DDR5内存:如此"光污染" 绝了
焦点速讯:电解质水到底有没有用?我来告诉你
美国人预期寿命降至25年来最低:三大因素导致一半的死亡
11月智能手机销量出炉:小米大卖340万台 国产第一
天天短讯!多方安全计算(6):MPC中场梳理
云原生时代,18 岁的 NGINX 过时了吗?
AcWing1131. 拯救大兵瑞恩
今日最新!东京奥运会陷入丑闻:审计人员发现实际成本高出20%
经典大富翁游戏《富甲天下3》登陆Steam 2023年1月9日发售
全球新资讯:Apache Log4j 远程代码执行漏洞(CVE-2021-44228、CVE-2021-45046)修复方案
全球速看:美国“毅力号”在火星上丢了个东西:意义重大
微动态丨vue3的setup函数的使用
微软:这四款游戏大作被索尼永久禁止登陆Xbox平台
天天看热讯:本田底气十足 全新一代皓影上市:18.59万元起
一个比一个经典!卡梅隆电影角色人气排名:终结者T-800第一
教你用JavaScript实现进度条
世界消息!Sentinel
【天天快播报】知名游戏在美区遭和谐:美女角色太性感
【天天速看料】千元档亮度天花板!哈趣K1 Pro投影仪评测:真1080P分辨率白天也清晰
猫是牛顿流体 还是非牛顿流体?中科院严肃科普
这也可以?20万法国人请愿重踢世界杯决赛 阿根廷赢的不光彩
AMD RX 7900 XT破发:10天便宜快400块
今日要闻!Shell脚本4
风暴袭击!美国多个州宣布进入紧急状态 道路能见度可能为零
快资讯:感受彼此体温 杰士邦超薄尊享30只礼盒装19.9元
世界资讯:乘联会喊话:千方百计增加居民收入 大家踊跃买汽车稳消费
【新要闻】【验证码逆向专栏】某验三代滑块验证码逆向分析
短讯!安全多方计算(5):隐私集合求交方案汇总分析
天天观速讯丨论文解读()《Detect Rumors in Microblog Posts for Low-Resource Domains via Adver
每日讯息!GitHub实用开源项目
环球报道:韩国载有216人客机飞行中出现异常:靠一台发动机平安降落
天天热文:特斯拉股价年内大跌60%!最大空头:明年可能会更惨
每日动态!还差14亿刀回本!《阿凡达2》全球票房破6亿美元 说中国影迷不感兴趣尚早
TCL华星13.3英寸定制全隐私屏研发成功!全屏防窥、防窃听
今日看点:二次伤害猛于虎 事故后驾驶员留在现场:半小时后被撞身亡
世界热议:上干货 | 园区智慧物联管理解决方案
Shell脚本3
全球信息:国产CPU力挺国产OS!x86兆芯加入deepin深度社区
焦点速讯:《炉石传说》国服停运倒计时!官方补偿来了:10个卡包你领吗?
车门都不给配 新款雪铁龙My ami Buggy官图发布:年满14就能开
全球热文:有了AMD RX7900、4090深受市场青睐:RTX 4080还一无是处?
比亚迪仰望来了!首发极具颠覆性技术
微头条丨AcWing341. 洛谷P1073, NOIP2009 最优贸易
百事通!面向对象与面向过程
全球速递!Flex布局总结
马斯克给全球车主发福利:每人可“白嫖”30天免费EAP试用服务
阵容十分豪华 2023最受期待的十大游戏来了:暗黑4位列第三
首发天玑8100:荣耀平板V8 Pro带来超级笔记 自动去广告
起点读书宣布百部经典作品限时免费:包括《诛仙》《红楼梦》等
世界热点!男子修车时发现4S店虚报维修定损金额 要求退一赔三胜诉
Codeforces 1630 E Expected Components 题解 (组合数学)
头条:Java基础项目:超市管理项目
每日动态!2023春运车票24日开售 除夕车票要等到1月7日
《妮姬》首月收入突破6.9亿!腾讯海外收入占比提升达12.5%
今日热门!超越电竞机!Redmi K60要榨干第二代骁龙8:画质、帧率、亮度三不降
每日精选:效果堪比镀铬 2.2万元的特斯拉Model Y新配色值不值?
环球观察:高可用 Canal集群 实操( 秒懂 + 史上最全)
微头条丨认证管理(锐捷业软篇)
Intel拆分GPU部门 一把手重回技术岗 累计亏损超20亿美金
天天通讯!iPhone 14 Pro爆出“闪线门” :屏幕出现诡异的绿色和黄色细横线
全球热点评!当ChatGPT遇上弱智吧:全程爆笑
夫妻的世界翻拍哪部电视剧?夫妻的世界最后结局是什么意思?
滕王阁为什么叫阁不叫楼?滕王阁为什么是三大名楼之首?
情非情砸车是第几集?情非情盖总和保姆的结局是什么?
小昭去波斯是哪一集?小昭去波斯后她母亲去哪儿了?
男人是大猪蹄子是什么意思?男人是大猪蹄子女人是什么?
排序算法模板(更新中)
当前速读:机器学习——果蔬分类
每日消息!性能超越电竞手机!Redmi K60 Pro综合跑分达135万
信息:千万别强忍 20岁小伙憋气压抑咳嗽导致昏厥
特斯拉今年股价累计暴跌超60%!马斯克透露大跌原因
收购动视暴雪遇阻 微软哭弱:根本打不过索尼、任天堂
到手9袋!良品铺子坚果礼盒1440 仅44元包邮
每日讯息!教你用JavaScript实现背景图像滑动
户外运动有哪些项目?户外运动品牌排行榜
什么鱼营养价值最高?什么鱼只会逆流而上?
金木水火土命怎么算出来的?金木水火土哪个腿长?
玉面小飞龙是什么意思?玉面小飞龙出自哪里?
Redmi K60系列上架:三颗口碑最好的芯片都拿到了 12月27日发
每日聚焦:最快闪充旗舰!真我GT Neo5充电头曝光:支持240W充电
环球热讯:紫米裁员80%并入小米?官方澄清:ZMI品牌将继续存在
全球新资讯:9.99万元遭疯抢 五菱宏光MINI EV敞篷版下线:能跑280km
苯胺皮是什么皮?苯胺皮和纳帕皮有什么区别?
世界新动态:CloudCanal实战-五分钟搞定Oracle到StarRocks数据迁移与同步
(一)elasticsearch 编译和启动
【速看料】马斯克辞任CEO,产品经理如何用项目协作软件武装自己?