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

Prism V2之旅(3)

阅读更多

    上篇介绍了Region的基本应用,这篇接上篇,继续介绍关于Region的相关应用—RegionAdapter

    示例代码下载

1.预先实现映射关系RegionAdapterMappings

 

RegionAdapterMappings对Control和RegionAdapter做了一个映射,这个映射是在Bootstrapper引导程序中完成的.

        protected virtual RegionAdapterMappings ConfigureRegionAdapterMappings()
        {
            RegionAdapterMappings regionAdapterMappings = Container.TryResolve<RegionAdapterMappings>();
            if (regionAdapterMappings != null)
            {
                regionAdapterMappings.RegisterMapping(typeof(Selector), this.Container.Resolve<SelectorRegionAdapter>());
                regionAdapterMappings.RegisterMapping(typeof(ItemsControl), this.Container.Resolve<ItemsControlRegionAdapter>());
                regionAdapterMappings.RegisterMapping(typeof(ContentControl), this.Container.Resolve<ContentControlRegionAdapter>());
            }

            return regionAdapterMappings;
        }

这里提供了三种控件支持,在上篇也有交代.RegionAdapter必须实现IRegionAdapter接口

2.在注册Region时寻找RegionAdapter

 

<StackPanel cal:RegionManager.RegionName="MainRegion"/>

 

以上的定义是错误的,因为在RegionAdapterMappings无法找到StackPanel和RegionAdapter的映射关系.以上附加属性的设置会尝试执行以下代码

protected virtual IRegion CreateRegion(DependencyObject targetElement, string regionName)
{
    // Build the region
    IRegionAdapter regionAdapter = this.regionAdapterMappings.GetMapping(targetElement.GetType());
    IRegion region = regionAdapter.Initialize(targetElement, regionName);

    return region;
}

 

为了支持StackPanel,我们可以尝试为StackPanel定义一个实现IRegionAdapter的区域适配器.

3.自定义RegionAdapter

以下为StackPanel定义RegionAdapter为例子

3.1.定义一个实现IRegionAdapter的适配器,在这里可以控制StackPanel对象

 

public class StackPanelRegionAdapter : IRegionAdapter
{
    public IRegion Initialize(object regionTarget, string regionName)
    {
        StackPanel panel = regionTarget as StackPanel;
        panel.Children.Add(new Label() { Content = "hello" });
        return new Region();
    }
}

 

3.2 重写Bootstrapper的ConfigureRegionAdapterMappings方法,注册映射关系

protected override RegionAdapterMappings ConfigureRegionAdapterMappings()
{
    RegionAdapterMappings regionAdapterMappings = base.ConfigureRegionAdapterMappings();
    regionAdapterMappings.RegisterMapping(typeof(StackPanel), this.Container.Resolve<StackPanelRegionAdapter>());
    return regionAdapterMappings;
}

 

现在就可以在StackPanel注册Region了

<StackPanel cal:RegionManager.RegionName="MainRegion"/>

 

4.根据Region的操作变更UI

 

我们来看一下IRegion接口

image

关于Region的基本应用在上篇已经介绍,主要用于对View的一些操作,之后ActiveViews和Views集合会发生变化,这两个集合是IViewsCollection类型并支持INotifyCollectionChanged接口.控件可以根据IRegion的信息变更做出变更.

以上StackPanelRegionAdapter重构后如下,看到这里再回头看上篇就能更好的理解Activate这些方法的作用了.

public class StackPanelRegionAdapter : IRegionAdapter
{
    public IRegion Initialize(object regionTarget, string regionName)
    {
        StackPanel panel = regionTarget as StackPanel;
        AllActiveRegion region = new AllActiveRegion();
        region.Name = regionName;
        region.ActiveViews.CollectionChanged += delegate
        {
            panel.Children.Clear();
            foreach (var item in region.ActiveViews)
            {
                panel.Children.Add(item as UIElement);
            }
        };
        return region;
    }
}

 

请注意,以上代码还无法执行虽然完成了适配,但当注册Region以后,还需要将Region添加到RegionManager中,我们还需要做一些额外的操作.prism提供内置的RegionAdapterBase抽象类,实现了IRegionAdapter,帮助我们做了一些额外的工作.我们可以从这个抽象类继承.

我们来看RegionAdapterBase实现的Initialize方法,给我们制定了模板,我们就重写这些方法就可以了

public IRegion Initialize(T regionTarget, string regionName)
{
    if (regionName == null)
        throw new ArgumentNullException("regionName");

    IRegion region = CreateRegion();
    region.Name = regionName;

    SetObservableRegionOnHostingControl(region, regionTarget);

    Adapt(region, regionTarget);
    AttachBehaviors(region, regionTarget);
    AttachDefaultBehaviors(region, regionTarget);
    return region;
}

一般情况下我们只需要重写Adapt和CreateRegion即可.先重构如下

public class StackPanelRegionAdapter : RegionAdapterBase<StackPanel>
{

    public StackPanelRegionAdapter(IRegionBehaviorFactory defaultBehaviors)
        : base(defaultBehaviors)
    {
    }

    protected override void Adapt(IRegion region, StackPanel regionTarget)
    {
        region.ActiveViews.CollectionChanged += delegate
        {
            regionTarget.Children.Clear();
            foreach (var item in region.ActiveViews)
            {
                regionTarget.Children.Add(item as UIElement);
            }
        };
    }

    protected override IRegion CreateRegion()
    {
        return new AllActiveRegion();
    }
}

 

内置实现IRegion有三个类型,如ContentControl并不是一个集合控件,则会创建一个SingelActiveRegion,集合控件则创建AllActiveRegion

image

 

在RegionAdapter中出现了RegionBehavior,将在下篇介绍此应用.下图解释了以上执行过程.

image

分享到:
评论

相关推荐

    Prism经典案例,Prism经典应用

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

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

    3. 如果要使用Prism.Forms,则需要安装Xamarin工作负载。 ### 下载Prism框架 Prism框架的源代码、文档和示例可以通过以下几种方式获取: - 通过fork Prism官方仓库来下载Prism的源代码和文档。 - 访问Prism的官方...

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

    3. **事件总线(EventAggregator)**:Prism提供了事件总线机制,让不同模块之间可以通过发布/订阅模式进行通信,无需直接引用对方,降低了模块间的耦合度。 4. **命令(Commands)**:Prism支持定义和实现UI无关的...

    C#Prism 例子与源码

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

    prism模板 vs插件

    prism模板 vs插件

    Prism.Maui-master.zip

    3. **导航服务(Navigation Service)**:Prism 提供了一个强大的导航服务,用于管理页面间的跳转。这使得开发者可以轻松地在不同视图间进行导航,并传递参数,保持代码的整洁。 4. **事件总线(EventAggregator)*...

    Prism 4.0安装包

    3. 命令与事件(Commands and Events):Prism提供了命令机制,使得视图模型能够触发UI操作,同时提供了事件总线,允许组件之间进行通信。 4. 视图模型定位(ViewModel Locator):简化了视图与视图模型的关联,使得...

    Delphi Prism Xe Crack

    3. Copy sanctuarylib.dll to C:\Program Files\Embarcadero\Delphi Prism\Bin 4. Run C:\Program Files\Embarcadero\Delphi Prism\Bin\LicenseManager.exe 5. Selete the menu item "License\Import",import C:\...

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

    3. **Prism**:Prism是微软开发的一个开源框架,主要针对WPF和UWP(Universal Windows Platform)应用。它遵循MVVM(Model-View-ViewModel)设计模式,提供模块化、依赖注入、事件聚合等功能,有助于实现更清晰的...

    Graphpad-Prism5中文教程

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

    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

    WPF Prism 可关闭的TabControl

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

    Prism7.1.0.431_WPF_官方中文文档

    3. **依赖注入**:Prism集成了Unity或Autofac等IoC(Inversion of Control)容器,用于管理对象的生命周期和解耦组件间的依赖关系。 4. **命令**:Prism提供了命令机制,使得在ViewModel中处理用户操作更加方便,...

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

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

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

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

    Prism Central 指南v5.5.pdf

    Prism Central 是 Nutanix 企业云平台的一部分,它提供了一个集中管理界面,使得IT管理员可以轻松地跨多个Nutanix集群进行管理和监控。在本指南中,我们将详细探讨Prism Central的多个功能和特性,以及如何在Nutanix...

    基于Prism框架的MVVM设计模式的WPF实例代码

    - **Module**: 在Prism中,模块化是其核心特性之一,允许开发者将应用程序划分为独立的模块,每个模块可以单独开发、测试和部署。在本示例中,可能包含有多个模块,每个模块负责特定的功能或业务领域。 - **...

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

    - **复杂性**:随着功能增加,应用程序的复杂性也随之增加,导致维护困难。 - **可扩展性**:随着需求变化,需要能够轻松添加新功能或修改现有功能。 - **测试**:大型应用的测试变得困难,需要有效的单元测试和集成...

    Prism写的客户端框架demo

    3. **MVVM(Model-View-ViewModel)**:Prism鼓励采用MVVM设计模式,分离视图、模型和视图模型之间的关注点。这有助于保持UI的独立性,同时使业务逻辑与用户界面分离。 4. **命令(Commands)**:Prism提供了实现和...

Global site tag (gtag.js) - Google Analytics