原文:Prism(WPF) 拐着尝试入门

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/s261676224/article/details/85269934

STEP 1  nuget包管理引入Prism.Core(7.1.0.431) & Prism.Unity(7.1.0.431)

解决方案目录结构:

STEP 2 创建Bootstrapper,这里我是创建了CPOSBootstrapper

在Prism应用中,创建Shell或者主窗口的责任是Bootstrapper的。因为Shell依赖的一些服务比如Region Manager需要在Shell显示之前初始化。

public class CPOSBootstrapper : UnityBootstrapper
{
public CPOSBootstrapper()
{ } protected override void ConfigureModuleCatalog()
{
base.ConfigureModuleCatalog();
ModuleCatalog moduleCatalog = (ModuleCatalog)ModuleCatalog;
moduleCatalog.AddModule(typeof(CPOS.SettlementListModule.ModuleInit));
} protected override DependencyObject CreateShell()
{
return this.Container.TryResolve<ShellView>();
} protected override void InitializeShell()
{
base.InitializeShell();
Application.Current.MainWindow = (Window) this.Shell;
if (Application.Current.MainWindow != null) Application.Current.MainWindow.Show();
}
}

注意重写

ConfigureModuleCatalog:配置模块目录(可以依次加入模块,通过AddModule)

CreateShell:创建Shell,Unity注入视图

InitializeShell:初始化Shell,指定主窗体并运行

STEP 3 在App.xaml.cs,指向Bootstrapper,这里我指向的是:CPOSBootstrapper

protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);
CPOSBootstrapper bootstrapper = new CPOSBootstrapper();
bootstrapper.Run();
}

 STEP 4 项目下增Views和ViewModels文件夹,同时新增视图及视图模型文件,如图

ShellView(在STEP2已经注入了,return this.Container.TryResolve<ShellView>())一般我们可以在这里设计UI大致布局,这里借鉴了官方例子的布局,实际这篇教程,也是来之官方事例修改,好了看下UI布局ShellView.xaml

图中分为3个区域,顶部说明区,结算区(ListRegion)以及商品选购区(MainRegion),显然这是一个很中规中矩的布局。这里引入的Region,说直白点实际就是应用程序UI的逻辑区域,很像一个Placeholder。通常我们并不直接和Region打交道,而是通过RegionManager,它实现了IRegionManager接口。IRegionManager接口包含一个只读属性Regions,是Region的集合AddToRegion:将一个视图添加到一个Region中。RegisterViewWithRegion:将一个视图和一个Region进行关联。当Region显示的时候,关联的视图才会显示,也就是说,在这个Region显示之前,关联的视图是不会被创建的。这里稍微拓展下,因为我们后面还要用到。

STEP 5 我们这里再建个类库项目,实际就是Module模块化编程思想,可以想象成一个独立的服务模块

如图,注意看ModuleInit 也是在STEP2,作为模块添加进去了。

再看下其中的源码,就看到了,IUnityContainer和IRegionManager接口,他们是干什么呢?看接口几乎猜出大半了吧。没错Unity依赖注入容器接口和逻辑区域管理接口。新建的ModuleInit必须继承IModule接口,看源码

public class ModuleInit : IModule
{
private readonly IUnityContainer container;
private readonly IRegionManager regionManager; private MainRegionController _mainRegionController; public ModuleInit(IUnityContainer container, IRegionManager regionManager)
{
this.container = container;
this.regionManager = regionManager;
} public void OnInitialized(IContainerProvider containerProvider)
{
//Register the IBill concrete type with the container
this.container.RegisterType<IBill, BillImp>(); this.regionManager.RegisterViewWithRegion(RegionNames.ListRegion,
() => this.container.Resolve<BillView>()); this._mainRegionController = this.container.Resolve<MainRegionController>();
} public void RegisterTypes(IContainerRegistry containerRegistry)
{ }
}

每一个Module中都需要有一个负责进行初始化工作以及与系统进行集成的角色,它需要实现IModule接口。IModule接口中只有一个Initialize方法,一方面这个接口将这个工程标记为一个Module,另一方面你可以在Initialize方法中实现一些逻辑,比如向容器中注册一些Service,或者将视图集成到程序中等等。

比如:this.container.RegisterType<IBill, BillImp>() 注入了服务this.regionManager.RegisterViewWithRegion(RegionNames.ListRegion, () => this.container.Resolve<BillView>())将BillView视图和RegionNames.ListRegion进行关联

为了便于Region管理,这里新增了静态类RegionNames.cs

public static class RegionNames
{
public const string MainRegion = "MainRegion";
public const string ListRegion = "ListRegion";
}

STEP 6 MVVM模型,以及Controller,Event,Service(这里可以定义接口,写实现,或者数据持久化操作等)

mvvm这里我不就细说了,可以google,百度,哪样舒服哪样来,看懂了就行了....此处省略一万字!!!

这里我们主要理解下通信组件,事件聚合器eventAggregator,实现了Pub-Sub事件机制。理解起来也没那么绕,Prism框架都帮我们搞定了,我们要做的,就是定义接口,发布和订阅OK了。在没有直接的行动反应期望的情况下,跨视图模型,演示者或控制者进行通信!

1.来个事件,以及参数(int->发布中goods.Id即为传入的值)

   public class BillSelectedEvent : PubSubEvent<int>{ }

2.用的两个模块都各自定义IEventAggregator 接口

   private readonly IEventAggregator eventAggregator;

3.该发布的发布

   this.eventAggregator.GetEvent<BillSelectedEvent>().Publish(goods.Id);

4.该订阅的订阅

   this.eventAggregator.GetEvent<BillSelectedEvent>().Subscribe(this.BillSelected, true);

STEP 7 源码再整理下稍后发布,如果有理解错的地方欢迎指导更正,谢谢各位看官!先看运行。调试截图。。。

图1,加载LeftRegion的时候,默认选择了结算区第一行ITEM,主要用于商品选购区的展示,这里是调试直接输出了 

 图2 比如选中第二行项,继续输出调试信息

 

Prism(WPF) 拐着尝试入门的更多相关文章

  1. [Windows] Prism 8.0 入门(下):Prism.Wpf 和 Prism.Unity

    1. Prism.Wpf 和 Prism.Unity 这篇是 Prism 8.0 入门的第二篇文章,上一篇介绍了 Prism.Core,这篇文章主要介绍 Prism.Wpf 和 Prism.Unity ...

  2. 二、从GitHub浏览Prism示例代码的方式入门WPF下的Prism之Modules的几种加载方式

    这一篇梳理Prism中07示例Module的几种加载方式. 07示例分为了5个,有5种不同的Module加载方式. 我们开始学习加载Modules 观察07-Modules-Appconfig示例 分 ...

  3. 三、从GitHub浏览Prism示例代码的方式入门WPF下的Prism之Mvvm的08-12示例

    这一篇是学习了前2篇RegionManager关联视图,和通过不同的方式加载Module示例之后的开始进入MVVM了. 从第08示例开始,进入了MVVM部分. 从08示例开始学习Prism下的MVVM ...

  4. 四、从GitHub浏览Prism示例代码的方式入门WPF下的Prism之Mvvm的13示例

    上一篇之分析了示例,没有最终写DEMO,把这一篇分析完,总结后一起写Prism下的MVVM例子. 这一篇开始分析从13示例开始,分析到MVVM主要部分结束然后写一个分析后的总结DEMO 添加一段新的内 ...

  5. 五、从GitHub浏览Prism示例代码的方式入门WPF下的Prism之MVVM中的EventAggregator

    这一篇我们主要再看完示例12.13后,写了个例子,用于再Modules下执行ApplicationCommands,使用IActiveAware执行当前View的Commands,或者Applicat ...

  6. WPF 使用 Direct2D1 画图入门

    本文来告诉大家如何在 WPF 使用 D2D 画图. 本文是一个系列 WPF 使用 Direct2D1 画图入门 WPF 使用 Direct2D1 画图 绘制基本图形 WPF 使用 SharpDX WP ...

  7. WPF 像素着色器入门:使用 Shazzam Shader Editor 编写 HLSL 像素着色器代码

    原文:WPF 像素着色器入门:使用 Shazzam Shader Editor 编写 HLSL 像素着色器代码 HLSL,High Level Shader Language,高级着色器语言,是 Di ...

  8. Prism+WPF使用DependencyInjection实现AutoMapper的依赖注入功能

    前言 在使用PRISM+WPF开发项目的过程中,需要使用AutoMapper实现对象-对象的映射功能.无奈PRISM没有相关对AutoMapper相关的类库,于是转换一下思想,在nuget 中存在有关 ...

  9. 一、从GitHub浏览Prism示例代码的方式入门WPF下的Prism

    最近这段时间一直在看一个开源软件PowerToys的源码,里面使用Modules的开发风格让我特别着迷,感觉比我现在写代码的风格好了太多太多.我尝试把PowerToys的架构分离了出来,但是发现代码维 ...

随机推荐

  1. ADB命令详解及大全( 声明:此文是参考大佬博客所做的笔记!)

    adb是什么? adb的全称为Android Debug Bridge,就是起到调试桥的作用.通过adb我们可以在Eclipse中方面通过DDMS来调试Android程序,说白了就是debug工具.a ...

  2. DB TABLE实践

    我的数据库设计实践(一)   兜兜转转,突然发现我现在已经是一个老司机了,一直写代码都很忙,没有把很多点点滴滴的记录下来,今天开始就开始一个系列,分析当年我接触或者我设计过的表结构,有好有坏,有欢喜也 ...

  3. 转 C++11 并发指南std::condition_variable详解

    之前看过,但是一直没有怎么用就忘了,转一篇别人的文字记录下来 本文将介绍 C++11 标准中 <condition_variable> 头文件里面的类和相关函数. <conditio ...

  4. bzoj2331 [SCOI2011]地板

    Description lxhgww的小名叫“小L”,这是因为他总是很喜欢L型的东西.小L家的客厅是一个的矩形,现在他想用L型的地板来铺满整个客厅,客厅里有些位置有柱子,不能铺地板.现在小L想知道,用 ...

  5. 配置tomcat远程debug

    Linux系统中在编辑catalina.sh文件,修改JAVA_OPTS的变量值为如下即可. JAVA_OPTS="$JAVA_OPTS $JSSE_OPTS -Xdebug -Xrunjd ...

  6. Cacti监控mysql数据库server实现过程

    前言:cactiserver端安装请參考:http://blog.csdn.net/mchdba/article/details/27120605 1 先在cactiserver端安装mysql模板 ...

  7. UVa 580 - Critical Mass(递推)

    链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  8. SSD 单发多框检测

    其实现在用的最多的是faster rcnn,等下再弄项目~~~ 图像经过基础网络块,三个减半模块,每个减半模块由两个二维卷积层,加一个maxPool减半(通道数依次增加[16,32,64]) 然后是多 ...

  9. ThinkPHP中前台输出变量

    1.   foreach <foreach name="list" item="vo" > {$key}|{$vo.id}:{$vo.name} & ...

  10. 【转】优秀的Java程序员必须了解GC的工作原理

    一个优秀的Java程序员必须了解GC的工作原理.如何优化GC的性能.如何与GC进行有限的交互,因为有一些应用程序对性能要求较高,例如嵌入式系统.实时系统等,只有全面提升内存的管理效率 ,才能提高整个应 ...