转载自:http://www.cnblogs.com/Clingingboy/archive/2009/01/07/prism_part2.html

本篇将介绍Prism中Region的使用.

本篇Demo下载

在这里我们统一prism里面一些名字的称谓.

1.Shell 主程序容器

2.Region 内容区域

3.Module 模块

4.wpf 不是特殊情况,就是指wpf和silverlight

一.wpf的内容控件

继承自ContentControl控件的,我们称之为内容控件.

<ContentControl Content=""></ContentControl>

ContentControl控件定义了一个Content,在没有框架的情况下,也可以将其作为一个内容区域.然而为了满足ui的需求,我们还需要各种不同的控件来当内容区域,如TabControl,DockPanel,Selector等。有些控件则继承自ItemsControl属于集合控件,不属于内容控件.但他们根据不同需求,同时都可以当容器使用,但他们的使用方式却不同.

为了统一对内容区域的操作,prism提供了一种适配模式,也可以说提供了控件与Region的映射关系.将不同可以作为容器的控件的操作方式统一为Region的操作方式.

prism内置有三种控件可以作为内容区域适配对象

  1. ContentControl
  2. ItemsControl
  3. Selector

看起来只有三个,但是只要是继承自这三个控件的其他控件也可以.下面介绍使用方法.

二.Region的基本操作,以下以Hello World为示例

1.在Shell中注册内容区域

如下代码,http://www.codeplex.com/CompositeWPF是prism注册的命名空间.

用RegionManager的附加属性RegionName注册了一个名叫MainRegion的内容区域

<Window x:Class="HelloWorldSample.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/CompositeWPF"
Title="Composite Application Library Sample" Width="400" Height="300">
<ContentControl cal:RegionManager.RegionName="MainRegion"/>
</Window>

2.通过IRegionManager获取已注册的内容区域

已注册的Region将保存在IRegionManager的Regions集合里面,根据注册的名字取出Region,将返回一个IRegion对象.

IRegion mainRegion = this.regionManager.Regions["MainRegion"];

3.在Region中添加内容

首先定义一个用户控件

<UserControl x:Class="HelloWorld.Views.HelloWorldView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Grid>
<TextBlock Text="Hello World" Foreground="Green"
HorizontalAlignment="Center" VerticalAlignment="Center"
FontFamily="Calibri" FontSize="24" FontWeight="Bold"></TextBlock>
</Grid>
</UserControl>

通过IRegion的Add方法添加用户控件.以下是一个简单模块的完成代码,当这个模块加载时,会默认执行Initialize方法.

public class HelloWorldModule : IModule
{
private readonly IRegionManager regionManager; public IUnityContainer container { get; set; } public HelloWorldModule(IRegionManager regionManager, IUnityContainer container)
{
this.regionManager = regionManager;
this.container = container;
} public void Initialize()
{
RenderHelloWorldView();
} void RenderHelloWorldView()
{
IRegion mainRegion = this.regionManager.Regions["MainRegion"];
mainRegion.Add(new HelloWorldView());
}
}

下图表达以上三个步骤的意思.

三.Region对View的操作

1.可以将以下操作并为一类.Add方法有三个重载,第三个方法下面再解释.当给View指定一个名字时,可以通过GetView方法获取View,然后通过Remove方法删除.

        IRegionManager Add(object view);
IRegionManager Add(object view, string viewName);
IRegionManager Add(object view, string viewName, bool
createRegionManagerScope);
void Remove(object view);
object GetView(string viewName); 2.激活和停用View
默认情况下,当一个View添加到Region当中,都被记做是处于活动状态。IRegion提供了2个集合和2个方法来控制View的活动状态.Activate方法将View转为可活动状态,Deactivate方法则冻结了View的使用.两个方法的调用将使Views和ActiveViews两个集合属性发生变化.IViewsCollection实现了INotifyCollectionChanged接口了,所以当集合发生变化时会触发一个事件来引发ui界面发生变化,这个事件的引发由Region和控件的适配器来完成.如何自定义RegionAdapter将在下次介绍,回头再看到这里就非常清楚了.
 
        IViewsCollection Views { get; }
IViewsCollection ActiveViews { get; }
void Activate(object view);
void Deactivate(object view);

四.注册子区域Region

1.在Region中添加的View同时也可以注册Region的,但这个被添加的View必须依靠依赖注入的功能才可以.请看以下示例

<UserControl x:Class="HelloWorld.Views.HelloWorldViewAgain"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:cal="http://www.codeplex.com/CompositeWPF"
Height="300" Width="300">
<Grid>
<StackPanel>
<TextBlock Text="HelloWorldViewAgain"></TextBlock>
<TextBlock Text="HelloWorldView Loading"></TextBlock>
<ItemsControl cal:RegionManager.RegionName="HelloWorldViewAgain"/>
<TextBlock Text="HelloWorldView Loaded"></TextBlock>
</StackPanel>
</Grid>
</UserControl>

在Shell的Region中添加HelloWorldViewAgain

void RenderHelloWorldViewAgain()
{
IRegion mainRegion = this.regionManager.Regions["MainRegion"];
HelloWorldViewAgain viewAgain = container.Resolve<HelloWorldViewAgain>();
mainRegion.Add(viewAgain, "MainRegion");
viewAgain.DisplayHelloWorldView();
}

DisplayHelloWorldView方法则在定义的HelloWorldViewAgain的Region添加了HelloWorldView

public void DisplayHelloWorldView()
{
IRegion secondRegion = this.regionManager.Regions["HelloWorldViewAgain"];
secondRegion.Add(new HelloWorldView());
}

下图表达了以上步骤的意思

2.设定RegionManager的管理范围

默认情况下,当注册一个Region的时候,RegionManager会将其加入到其Regions集合当中.

<ContentControl  x:Name=”panel” cal:RegionManager.RegionName="MainRegion"/>

这个Regions属性属于ContentControl的附加属性,可以通过RegionManager的GetRegionManager方法获取该控件的Region集合.

回头再看上面的一个Add方法.

IRegionManager Add(object view, string viewName, bool createRegionManagerScope);

在添加Region中添加一个View的时候,你可以指定是否重新设定RegionManager的范围.如果设置为True的话,将会调用CreateRegionManager方法为当前的View重新创建一个RegionManager.这就说明了如果创建的View中注册了一个Region,改Region是不知道其存在哪个RegionManager里面的.

现在我们重新更改上面的RenderHelloWorldViewAgain方法,添加View时,

第三个参数设置为True,如下

void RenderHelloWorldViewAgain()
{
IRegion mainRegion = this.regionManager.Regions["MainRegion"];
HelloWorldViewAgain viewAgain = container.Resolve<HelloWorldViewAgain>();
mainRegion.Add(viewAgain, "HelloWorldViewAgain",true);
viewAgain.DisplayHelloWorldView();
}

这时HelloWorldViewAgain这个View已注册的Region,就很难知道其在哪个RegionManager,现在DisplayHelloWorldView方法更改如下

public void DisplayHelloWorldView()
{
var view=this.regionManager.Regions["MainRegion"].GetView("HelloWorldViewAgain") as DependencyObject;
IRegion region=RegionManager.GetRegionManager(view).Regions["HelloWorldViewAgain"];
region.Add(new HelloWorldView(), "hello");
}

这种做法虽然可以避免Region重名等一些问题,但为获取Region的RegionManager也有一些麻烦.

Prism 学习(一)的更多相关文章

  1. Prism学习(1)---前期准备

    本文摘取自Gene's Blog的博客园文章,版权归Gene's Blog,仅供个人学习参考.转载请标明原作者Gene's Blog. 在学习Prism框架之前,我预先写了一个非常简单的计算器解决方案 ...

  2. Prism学习--实现可插拔的模块

    首先,在使用Prism框架加载的程序集中分别添加一个类,并让这些类实现IModule接口.当Prism框架加载某个程序集后,将首先在程序集中搜索实现了该接口的类.之后将会调用该接口的Initializ ...

  3. Prism 学习:从配置文件中加载 Module

    之前我们已经了解过,如何从指定的目录中来加载 Module(原文),现在我们来看,如何从应用程序的配置文件中来加载 Module.以这种方式来加载 Module 的优点包括:1. 被加载的 Modul ...

  4. Prism 学习:从本地目录加载 Module

    在 Prism 中,将外部模块加载到主程序有以下几种方式:Code.XAML.配置文件.指定模块目录:其中,如果要使用 Code 方式来加载 Module,则需要将该 Module 引用到当前项目中: ...

  5. Prism学习笔记-模块之间通信的几种方式

    在开发大型复杂系统时,我们通常会按功能将系统分成很多模块,这样模块就可以独立的并行开发.测试.部署.修改.使用Prism框架设计表现层时,我们也会遵循这个原则,按功能相关性将界面划分为多个模块,每个模 ...

  6. GridRegionAdapter(slivelight)

    原地址:http://www.xuebuyuan.com/68722.html Prism学习之SilverlightWindowRegionAdapter[0评] 文章作者: healer 文章分类 ...

  7. Prism - WPF MVVM(Model-View-ViewModel)设计模式【学习】

    开发工具: VS2010 Blend Prism框架 基本概念: 数据绑定,依赖属性,依赖对象 WPF 委托式命令 Icommand接口 Lambda表达式 MVVM(Model-View-ViewM ...

  8. WPF MVVM 从Prism中学习设计模式之Event Aggregator 模式

    Prism简介 Prism是由微软Patterns & Practices团队开发的项目,目的在于帮助开发人员构建松散耦合的.更灵活.更易于维护并且更易于测试的WPF应用或是Silverlig ...

  9. prism 的学习网站

    C#的学习网址: https://www.cnblogs.com/zh7791

  10. [WPF系列]从基础起步学习系列计划

    引言 WPF技术已经算不什么新技术,一搜一大把关于WPF基础甚至高级的内容.之前工作中一直使用winform所以一直没有深入学习WPF,这次因项目中使用了WPF技术来实现比较酷的展示界面.我在这里只是 ...

随机推荐

  1. arcpy获取polygon内环

    当使用arcpy获取polygon几何的时候,不能像ao一样获取到内外环,只能获取到单个部件.而part返回的即是一个点组了. 所以只能通过None对象进行分割,确定部件内的内外环.一个part内,只 ...

  2. 程序员出海做 AI 工具:如何用 similarweb 找到最佳流量渠道?

    如题,今天给大家带来实操的一个小教程.这里先抛出个问题:"做海外流量增长,如何为产品制定营销渠道?" 分享一个方法只需要 3 步,方法如下: 找到和你产品最接近的细分 Top 竞争 ...

  3. 【Linux】课堂练习作业

    # 作业Day01-关机练习作业 查询在线用户 who -H 查询服务状态 systemctl status sshd 停止服务 systemctl stop sshd 停止后再次检查服务状态 方法一 ...

  4. 在linu系统安装apache全过程(httpd、apr、apr-util、pcre)以及进行相应配置

    1.下载安装包,需要下面3个安装包[root@bes2 apache]# ll总用量 8520-rw-r--r--. 1 root root 1020833 9月 18 17:47 apr-1.5.1 ...

  5. swagger 文件上传以及requestbody参数传递

    swagger用来做普通的API测试很方便,在实际开发过程中,经常会有文件上传,或者通过reuestbody传递数据等方式. 这个时候swagger的配置就有一些特殊了 . swagger reque ...

  6. dubbo(一)spring schema拓展技术

    https://blog.csdn.net/java_zldz_xuws/article/details/84648398 在阐述dubbo原理之前,我先介绍一下dubbo与spring怎么糅合在一块 ...

  7. 记一次单元测试问题com.sun.crypto.provider.HmacSHA1 cannot be cast to javax.crypto.MacSpi

    在用单元测试Junit测试部门的SDK时,有个md5鉴权步骤,出现了java.lang.ClassCastException: com.sun.crypto.provider.HmacSHA1 can ...

  8. 龙哥量化:注册simnow上期所的期货仿真模拟交易账户教程步骤

    永远顺着趋势交易 在技术分析这种市场研究方法中,趋势的概念绝对是核心内容.分析师所使用的全部工具, 诸如支撑和阻挡水平.价格形态.移动平均线.趋势线等等,其唯一的目的就是辅助我们估量市场趋势, 从而顺 ...

  9. Qt开源作品41-网络调试助手增强版V2022

    一.前言 做网络通信少不了网络收发数据,经常用到网络数据的调试相关工具,以便侦听数据用来判断数据是否正确,许久以前就发布过类似的工具,第一版大概在2013年,第二版大概在2017年,中间参考过不少的网 ...

  10. Qt音视频开发30-Onvif事件订阅

    一.前言 能够接收摄像机的报警事件,比如几乎所有的摄像机后面会增加报警输入输出接口,如果用户外接了报警输入,则当触发报警以后,对应的事件也会通过onvif传出去,这样就相当于兼容了所有onvif摄像机 ...