`
clingingboy
  • 浏览: 27161 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
最近访客 更多访客>>
社区版块
存档分类
最新评论

Prism V2之旅(2)

阅读更多

     本篇将介绍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());
    }
}

 

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

image

三.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());
}

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

image

 

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也有一些麻烦.

 

这篇主要介绍了Region的一些基本功能,下篇将继续讨论.

分享到:
评论

相关推荐

    Prism经典案例,Prism经典应用

    1. **模块化(Modularity)**:Prism的核心特性之一是模块化,它允许将大型应用程序分解为小的、独立的模块,每个模块都有自己的功能。这样可以提高代码的可重用性,使得开发和维护变得更加容易。在示例中,你可能会...

    Prism Manual.pdf Prism8框架官方手册 MD 文件转pdf

    2. 选择Prism库项目文件并添加到解决方案中。 3. 为了防止不小心构建这些项目,需要在构建菜单中点击“配置管理器”,然后清除所有Prism库项目的构建复选框,适用于调试和发布配置。 ### 深入理解Prism框架 由于...

    GraphPad Prism v8.0.2.263 ZH-CN.rar

    GraphPad Prism是一款在科研领域广泛使用的统计分析和图形绘制软件,尤其受到生物医学、生命科学以及化学等领域的研究人员青睐。其v8.0.2.263版本是中国语言版本,具有简体中文界面,方便中国用户使用。该版本不仅...

    WPF Prism实例(多个实例包含Prism各个重要概念实例)

    2. **依赖注入(Dependency Injection,DI)**:通过容器如Unity或Autofac,Prism支持依赖注入,允许在运行时动态组合组件,提高代码的可测试性和可维护性。 3. **事件总线(EventAggregator)**:Prism提供了事件...

    C#Prism 例子与源码

    Prism 的核心特性之一是模块化。模块化允许将大型应用程序分解为小的、独立的功能单元,每个单元称为模块。这样可以分别开发、测试和部署这些模块,提高代码的复用性和可维护性。文件名 "Prism-7.2.0.1422" 可能包含...

    prism模板 vs插件

    prism模板 vs插件

    Prism.Maui-master.zip

    2. **依赖注入(Dependency Injection, DI)**:Prism 内置了容器,如 Unity 或 Autofac,用于实现依赖注入,使得对象间的依赖关系可以在运行时动态配置,提高代码的灵活性和可测试性。开发者可以方便地注册服务并...

    《GraphPad Prism》 [亲测:中文版-免安装]

    本资源为GraphPad Prism v8.0.2.263 [中文版\免安装],仅限用于学习交流。严禁商用!!! GraphPad Prism是一款高效易用的科研绘图工具,它可以将科学图形、综合曲线拟合(非线性回归)、可理解的统计数据、数据组织...

    Prism 4.0安装包

    2. 依赖注入(Dependency Injection, DI):Prism支持多种DI容器,如Unity或Mef,帮助解耦组件之间的依赖关系,提高代码的可测试性和可维护性。 3. 命令与事件(Commands and Events):Prism提供了命令机制,使得...

    Delphi Prism Xe Crack

    2. Copy PrismXe.slip to C:\Program Files\Embarcadero\Delphi Prism\License 3. Copy sanctuarylib.dll to C:\Program Files\Embarcadero\Delphi Prism\Bin 4. Run C:\Program Files\Embarcadero\Delphi Prism\Bin...

    WPF prism MEF 架构

    **2. MEF介绍** - **插件架构(Plugin Architecture)**:MEF提供了一种机制,允许应用程序在运行时发现和加载外部组件,这些组件可以在不修改主应用程序的情况下添加新功能或扩展已有功能。 - **导出(Export)和...

    GraphPad Prism 5.0 usb免安装版

    GraphPad Prism 是一个包括基础生命统计、曲线匹配和科学作图的强大结合体。在一百多个国家有超过 10 万个科学家正在试用 Prism 来分析、绘图和呈现他们的科学数据。 是什么令许多世界上领先的大学、医学中心、研究...

    WPF PRISM 5.0源码

    WPF PRISM5.0框架源代码,适合WPF初学者或者有一定开发经验的C#程序员,包含:Microsoft.Practices.Prism、Microsoft.Practices.Prism.MefExtensions、 Microsoft.Practices.ServiceLocation

    C#+WPF+Prism模块化开发示例

    **C# WPF Prism模块化开发示例** 在软件开发中,C#、WPF(Windows Presentation Foundation)和Prism框架结合使用,可以构建出高效、可维护且可扩展的桌面应用程序。本示例旨在介绍如何利用Prism进行模块化的WPF...

    Graphpad-Prism5中文教程

    GraphPad Prism 5.0 中文教程 GraphPad Prism 5.0 是一个功能强大的数据分析和图形化工具,它可以帮助用户快速、准确地处理和可视化数据。在本教程中,我们将详细介绍 GraphPad Prism 5.0 的使用方法和技巧,从...

    WPF Prism 可关闭的TabControl

    在本文中,我们将深入探讨如何在WPF应用中利用Prism框架实现一个可关闭的TabControl。WPF(Windows Presentation Foundation)是.NET Framework的一部分,提供了一种强大的方式来构建丰富的、具有图形用户界面的应用...

    Prism7.1.0.431_WPF_官方中文文档

    2. **MVVM(Model-View-ViewModel)模式**:Prism支持MVVM设计模式,鼓励分离关注点和实现数据绑定,提高代码的可读性和可测试性。ViewModel作为View和Model之间的桥梁,负责业务逻辑和UI交互。 3. **依赖注入**:...

    Blue Prism 功能摘要 中文文档

    Blue Prism 2019 功能摘要 最新中文文档 RPA 机器人过程自动化 用户指南 主要版本: 6 文档修订版:1.0 BluePrism6 简介 数字化劳动力操作系统 Blue Prism 6 利用领先的人工智能 (AI)、机器学习、分析和云功能,...

    delphi Prism 2010 序列号(完全可用)

    在探讨Delphi Prism 2010及其序列号的相关知识点时,我们首先需要明确几个重要的概念:Delphi Prism 2010是什么?它有哪些特点?以及如何合法地获取和使用该软件。 ### Delphi Prism 2010概述 Delphi Prism 2010是...

    Prism7.1.0.431_WPF_官方中文文档.pdf

    模块化应用程序开发是Prism的核心优势之一,文档第四部分专注于此。构建模块化应用程序的好处被一一阐述,例如,它能提供更好的维护性、可扩展性和可测试性。文档详细讨论了IModule接口,该接口是模块化应用程序的...

Global site tag (gtag.js) - Google Analytics