首先,简单地介绍说一下单一应用程序与复合应用程序。

一、单一应用程序

看看上面这张图片,假如我们当前的需求是实现主界面如图所示。如果将其构建成具有用户控件的传统 WPF 应用程序,首先应构建一个顶层窗口并针对上述各个功能添加用户控件。在这种情况下,我们需要实现以下用户控件:PositionGrid、PositionSummary、TrendLine 和 WatchList等等。然后,使用 RoutedEvents、RoutedCommands 和数据绑定将所有内容连接起来。

在这种情况下,应用程序与每个控件都紧密耦合在一起,UI 中存在大量用于协调各个部分的逻辑,控件之间还存在着相互依赖关系。如何解决这些问题?接下来看介绍一下复合应用程序。

二、复合应用程序

复合应用程序由运行时动态发现和构成的松散耦合模块组成。模块包含代表系统的不同垂直片段的可视和非可视组件,可视组件(视图)被组合在一个常规外壳中,可用作应用程序所有内容的宿主。复合应用程序可提供各种服务,将这些模块级组件结合在一起,模块可提供与应用程序的特定功能相关的其他服务。

从较高的层次来看,复合应用程序是“复合视图”设计模式的实现,此模式可描述包含子项的视图的递归 UI 结构,这些子项本身也是视图。这些视图然后通过某种机制组合起来 — 通常是在运行时而非设计时静态组合。

接下来介绍的Prism则是一个实现复合应用程序的框架!

三、Prism

根据上图,我们可以了解到复合应用程序包含三个模块:Shell、模块和视图,既然Prism是一个实现复合应用程序的框架,那么也应该包括这三个模块。

    1.Shell

在Prism中,在启动应用之前,需要进行一系列初始化工作(注册Module等),需要将MainWindow删除掉,同时删除App.xmal中的StartUpUri,创建Shell,主应用程序容器。同时创建Bootstrapper.cs并实现接口UnityBootstrapper,在其中实现抽象方法CreateShell.

 class Bootstrapper : UnityBootstrapper
{
protected override DependencyObject CreateShell()
{
return Container.Resolve<Shell>();
} protected override void InitializeModules()
{
base.InitializeModules();
App.Current.MainWindow = (Shell)Shell;
App.Current.MainWindow.Show();
} protected override void ConfigureModuleCatalog()
{
base.ConfigureModuleCatalog();
ModuleCatalog moduleCatalog = (ModuleCatalog)this.ModuleCatalog; moduleCatalog.AddModule(typeof(PrismApp.ModuleExample.HelloWorldModule));
moduleCatalog.AddModule(typeof(PrismApp.Module.HelloPrismModule));
}

在App.cs中重载OnStartup,并通过Bootstrapper中的Run函数来启动程序

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

  2.Module

Module,程序的组成模块。实现IModule接口。

 public class HelloPrismModule:IModule
{
private readonly IRegionViewRegistry regionViewRegistry; public HelloPrismModule(IRegionViewRegistry registry)
{
this.regionViewRegistry = registry;
} public void Initialize()
{
regionViewRegistry.RegisterViewWithRegion("NextRegion", typeof(PrismApp.HelloPrismModule.HelloPrismModuleView));
}
}

并在Bootstrapper.cs中ConfigrueModuleCatalog方法中进行注册

   protected override void ConfigureModuleCatalog()
{
base.ConfigureModuleCatalog();
ModuleCatalog moduleCatalog = (ModuleCatalog)this.ModuleCatalog; moduleCatalog.AddModule(typeof(PrismApp.ModuleExample.HelloWorldModule));
moduleCatalog.AddModule(typeof(PrismApp.Module.HelloPrismModule));
}

   3.Region

Region,内容区域,可以提供各个模块加载所需的视图,Prism默认提供三种Region,分别是ContentControl、ItemsControl和Selector.我们也可以自定义Region(下一节介绍)。通过附加属性来设置RegionManager.RegionName

<Window x:Class="PrismApp.Shell.Shell"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:cal="http://www.codeplex.com/prism"
Title="MainWindow" Height="" Width="">
<Grid>
<Grid.RowDefinitions>
<RowDefinition></RowDefinition>
<RowDefinition></RowDefinition>
</Grid.RowDefinitions>
<ContentControl Name="MainRegion" cal:RegionManager.RegionName="MainRegion" ></ContentControl>
<ContentControl Name="NextRegion" Grid.Row="" cal:RegionManager.RegionName="NextRegion" ></ContentControl>
</Grid>
</Window>

并在每个Module的Initalize方法对Region进行注册

  public void Initialize()
{
regionViewRegistry.RegisterViewWithRegion("MainRegion", typeof(PrismApp.ModuleExample.HelloWorldModuleView));
}

总结

本文主要是介绍了单一应用程序与复合应用程序。初步介绍了Prism以及Prism的三个点:Shell、Module和Region,接下来会根据Prism的源码对这个Prism进行详细的介绍。

Prism之初识的更多相关文章

  1. Silverlight项目笔记4:初识Prism以及IoC

    1.Prism Prism是由微软Patterns & Practices团队开发的针对WPF和Silverlight的MVVM框架. Prism的几个关键点: (1)启动器类UnityBoo ...

  2. wordpress优化之结合prism.js为编辑器自定义按钮转化代码

    原文链接 http://ymblog.net/2016/07/24/wordpress-prism/ 继昨天花了一天一夜的时间匆匆写了主题Jiameil3.0之后,心中一直在想着优化加速,体验更好,插 ...

  3. 从PRISM开始学WPF(二)Prism?

    目录: 从PRISM开始学WPF(一)WPF? 从PRISM开始学WPF(二)Prism? 从PRISM开始学WPF(三)Prism-Region? 从PRISM开始学WPF(四)Prism-Modu ...

  4. 从PRISM开始学WPF(二)Prism-更新至Prism7.1

    0x1 PRISM? PRISM项目地址:https://github.com/PrismLibrary/Prism 先看下简介: Prism is a framework for building ...

  5. Xamarin+Prism开发详解六:DependencyService与IPlatformInitializer的关系

    祝各位2017年事业辉煌!开年第一篇博客,继续探索Xamarin.Forms… 为什么我做Xamarin开发的时候中意于Prism.Forms框架?本章为你揭晓. 实例代码地址:https://git ...

  6. Xamarin+Prism开发详解五:页面布局基础知识

    说实在的研究Xamarin到现在,自己就没设计出一款好的UI,基本都在研究后台逻辑之类的!作为Xamarin爱好者,一些简单的页面布局知识还是必备的. 布局常见标签: StackLayout Abso ...

  7. Xamarin+Prism开发详解四:简单Mac OS 虚拟机安装方法与Visual Studio for Mac 初体验

    Mac OS 虚拟机安装方法 最近把自己的电脑升级了一下SSD固态硬盘,总算是有容量安装Mac 虚拟机了!经过心碎的安装探索,尝试了国内外的各种安装方法,最后在youtube上找到了一个好方法. 简单 ...

  8. Xamarin+Prism开发详解三:Visual studio 2017 RC初体验

    Visual studio 2017 RC出来一段时间了,最近有时间就想安装试试,随带分享一下安装使用体验. 1,卸载visual studio 2015 虽然可以同时安装visual studio ...

  9. Xamarin+Prism开发详解一:PCL跨平台类库与Profile的关系

    在[Xamarin+Prism小试牛刀:定制跨平台Outlook邮箱应用]中提到过以下错误,不知道大伙还记得不: 无法安装程序包"Microsoft.Identity.Client 1.0. ...

随机推荐

  1. pyqt5事件与鼠标事件

    一,每个事件都被封装成相应的类: pyqt中,每个事件类型都被封装成相应的事件类,如鼠标事件为QMouseEvent,键盘事件为QKeyEvent等.而它们的基类是QEvent. 二,基类QEvent ...

  2. ES6中箭头函数的作用

    我们知道在ES6中,引入了箭头函数,其本质就是等同有ES5中的函数.类似于下面的写法: let test1=() => “abc”; let test2=() => { return “a ...

  3. ImportError: No module named 'serial'

    /******************************************************************************** * ImportError: No ...

  4. Luogu2435 染色【状压qwq】【轮廓线DP】

    LINK 题目大意 有一个 n 行 m 列的格点图,你需要给每个点上染上 k 种颜色中的一种,要求没有两个相邻点颜色相同.给定第一行与最后一行的染色,试求总染色方案数. 思路 暴力预处理状态暴力转移可 ...

  5. EXCEL中如何删除透视表的多余汇总

    EXCEL中如何删除透视表的多余汇总 1)如下图,选中字段列,单击鼠标右键,在弹出的菜单中选择[字段设置]选项. 2)弹出[字段设置]对话框. 3)选择“分类汇总和筛选”选项卡,然后勾选“无”选项,单 ...

  6. linux svn soeasy

    http://blog.163.com/longsu2010@yeah/blog/static/173612348201202114212933/

  7. 黄聪:sqlserver 2008修改数据库表的时候错误提示“阻止保存要求重新创建表的更改”

    当用户在在SQL Server 2008企业管理器中更改表结构时,必须要先删除原来的表, 然后重新创建新表,才能完成表的更改,如果强行更改会出现以下提示:不允许保存更改 .您所做的更改要求删除并重新创 ...

  8. C++ 构造函数_拷贝构造函数

    拷贝构造函数

  9. [转]使用Android-Studio 开发Android 程序

    界面主题可以从这里下载:http://color-themes.com/ 杂七杂八(包含Android-Studio 自身):http://www.androiddevtools.cn/ genymo ...

  10. 搜索引擎Lucene之皮毛

    一.Lucene是apache软件基金会4 jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,但它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索 ...