WPF Prism(一)Region

WPF Prism(一)Region
WPF Prism(二)Module
WPF Prism(三)ViewModelLocator
WPF Prism(四)MVVM
WPF Prism(五)Navigation
WPF Prism(六)Dialog

一、什么是Region

在Prism当中,一个页面我们可以不再为其固定显示的内容,而这种概念变成了区域(Region)划分的概念。将页面显示的区域划分成N个Region,每一个Region将动态分配区域。它将负责承担我们的UI组件或者控件。

二、RegionManager类

RegionManager
IRegionManager
+ IRegionCollection Regions
+IRegionManager AddToRegion(string regionName, object view)
+RegisterViewWithRegion(string regionName, Type viewType)

RegionManager功能

  • 维护区域集合
  • 提供对区域的访问
  • 合成视图
  • 区域导航
  • 定义区域

三、使用RegionManager

首先,我们需要将MainWindow的构造函数传入IRegionManager参数:

    public partial class MainWindow : Window
    {
        public MainWindow(IRegionManager regionManager)
        {
            InitializeComponent();


        }
    }

注意:因为MainWindow对象是我们在App类中使用容器解析得到的,那么它需要的依赖IRegion也会自动被创建,不需要我们自己创建。

在定义视图与Region之间的映射关系之前我们需要先定义Region,定义Region有两种方法:

3.1、在xaml中

<Window
    xmlns:prism="http://prismlibrary.com/"
    Title="Shell">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="0.2*" />
            <RowDefinition />
        </Grid.RowDefinitions>
        <ContentControl Grid.Row="0" prism:RegionManager.RegionName="HeaderRegion" />
    </Grid>
</Window>

代码有省略,重点关注需要引入prism命名空间。

3.2、在cs文件中

<ContentControl x:Name="Header" Grid.Row="0" />
        public MainWindow(IRegionManager regionManager)
        {
            InitializeComponent();

            RegionManager.SetRegionName(Header, "HeaderRegion");
        }

上述两种方式都是可以的。

四、View Discovery和View Injection

现在我们在MainWindow中定义了三个Region,同时定义了三个UserControl。

<Window
    x:Class="PrismBlankAppCore.Views.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:prism="http://prismlibrary.com/"
    Title="Shell"
    Width="525"
    Height="350">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="0.2*" />
            <RowDefinition />
        </Grid.RowDefinitions>
        <ContentControl Grid.Row="0" prism:RegionManager.RegionName="HeaderRegion" />
        <Grid Grid.Row="1">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="0.4*" />
                <ColumnDefinition />
            </Grid.ColumnDefinitions>

            <ContentControl Grid.Column="0" prism:RegionManager.RegionName="MenuRegion" />

            <ContentControl Grid.Column="1" prism:RegionManager.RegionName="ContentRegion" />
        </Grid>
    </Grid>
</Window>

在这里插入图片描述

在Prism中有两种方式来定义视图与Region之间的映射关系——View DiscoveryView Injection

4.1View Discovery

        public MainWindow(IRegionManager regionManager)
        {
            InitializeComponent();

            //View Dicovery
            regionManager.RegisterViewWithRegion("HeaderRegion", typeof(HeaderView));
            regionManager.RegisterViewWithRegion("MenuRegion", typeof(MenuView));
            regionManager.RegisterViewWithRegion("ContentRegion", typeof(ContentView));
        }

4.2View Injection

    public partial class MainWindow : Window
    {
        private IRegionManager regionManager;
        private IContainerExtension container;
        public MainWindow(IRegionManager regionManager, IContainerExtension container)
        {
            InitializeComponent();

            //View Dicovery
            //regionManager.RegisterViewWithRegion("HeaderRegion", typeof(HeaderView));
            //regionManager.RegisterViewWithRegion("MenuRegion", typeof(MenuView));
            //regionManager.RegisterViewWithRegion("ContentRegion", typeof(ContentView));
            this.regionManager = regionManager;
            this.container = container;
        }


        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            //View Injection
            HeaderView headerView = container.Resolve<HeaderView>();
            regionManager.Regions["HeaderRegion"].Add(headerView);

            MenuView menuView = container.Resolve<MenuView>();
            regionManager.Regions["MenuRegion"].Add(menuView);

            ContentView contentView = container.Resolve<ContentView>();
            regionManager.Regions["ContentRegion"].Add(contentView);
        }
    }

注入View的时候需要用到Add方法,还得提前将View对象创建好,所以在构造函数中我们需要注入IRegionManager和IContainerExtension的实现。

值得一提的是,在构造函数中IRegionManager对象还没有创建完成(应该是RegionName还没有创建完成),所以在Load函数中完成View Injection。如果需要View对象是单例的,可以提前在App类的重写函数中注册单例对象。

在这里插入图片描述

4.3Active和Deactivate

将App类修改为:View对象注册为单例对象。

        protected override void RegisterTypes(IContainerRegistry containerRegistry)
        {
            containerRegistry.RegisterSingleton<HeaderView>();
            containerRegistry.RegisterSingleton<MenuView>();
            containerRegistry.RegisterSingleton<ContentView>();
        }

MainWindow增加了三个按钮:

        <UniformGrid Grid.Row="2" Columns="3">
            <Button
                Width="80"
                Height="30"
                Content="Activate" Click="Activate"/>
            <Button
                Width="80"
                Height="30"
                Content="Refresh" Click="Refresh" />
            <Button
                Width="80"
                Height="30"
                Content="Deactivate" Click="Deactivate
                " />
        </UniformGrid>

增加对应的三个方法:

    private void Activate(object sender, RoutedEventArgs e)
    {
        //激活
        HeaderView headerView = container.Resolve<HeaderView>();
        regionManager.Regions["HeaderRegion"].Activate(headerView);

        MenuView menuView = container.Resolve<MenuView>();
        regionManager.Regions["MenuRegion"].Activate(menuView);

        ContentView contentView = container.Resolve<ContentView>();
        regionManager.Regions["ContentRegion"].Activate(contentView);
    }

    private void Refresh(object sender, RoutedEventArgs e)
    {
        //刷新  因为已经add过,所以需要先remove
        HeaderView headerView = container.Resolve<HeaderView>();
        regionManager.Regions["HeaderRegion"].Remove(headerView);

        MenuView menuView = container.Resolve<MenuView>();
        regionManager.Regions["MenuRegion"].Remove(menuView);

        ContentView contentView = container.Resolve<ContentView>();
        regionManager.Regions["ContentRegion"].Remove(contentView);

        regionManager.Regions["HeaderRegion"].Add(headerView);

        regionManager.Regions["MenuRegion"].Add(menuView);

        regionManager.Regions["ContentRegion"].Add(contentView);
    }

    private void Deactivate(object sender, RoutedEventArgs e)
    {
        //使无效
        HeaderView headerView = container.Resolve<HeaderView>();
        regionManager.Regions["HeaderRegion"].Deactivate(headerView);

        MenuView menuView = container.Resolve<MenuView>();
        regionManager.Regions["MenuRegion"].Deactivate(menuView);

        ContentView contentView = container.Resolve<ContentView>();
        regionManager.Regions["ContentRegion"].Deactivate(contentView);
    }

在这里插入图片描述

五、RegionAdapters

Prism提供了许多内置得RegionAdapter:

  • ContentControlRegionAdapter
  • ItemsControlRegionAdapter
  • SelectorRegionAdapter
    - ComboBox
    - ListBox
    - Ribbon
    - TabControl

除此之外,如果想要实现控件作用域Region,则必须创建自定义RegionAdapter。

下面我们创建一个一个基于StackPanel的自定义适配器。

5.1首先从创建一个继承于RegionAdapterBase的类。

    public class StackPanelRegionAdapter : RegionAdapterBase<StackPanel>
    {
        public StackPanelRegionAdapter(IRegionBehaviorFactory regionBehaviorFactory) : base(regionBehaviorFactory)
        {

        }
        protected override void Adapt(IRegion region, StackPanel regionTarget)
        {
            throw new System.NotImplementedException();
        }

        protected override IRegion CreateRegion()
        {
            throw new System.NotImplementedException();
        }
    }

5.2实现重写的方法

public class StackPanelRegionAdapter : RegionAdapterBase<StackPanel>
{
    public StackPanelRegionAdapter(IRegionBehaviorFactory regionBehaviorFactory) : base(regionBehaviorFactory)
    {

    }
    protected override void Adapt(IRegion region, StackPanel regionTarget)
    {
        region.Views.CollectionChanged += (s, e) =>
        {
            if (e.Action == NotifyCollectionChangedAction.Add)
            {
                foreach (FrameworkElement element in e.NewItems)
                {
                    regionTarget.Children.Add(element);
                }
            }
            else if (e.Action == NotifyCollectionChangedAction.Remove)
            {
                foreach (FrameworkElement element in e.OldItems)
                {
                    regionTarget.Children.Remove(element);
                }
            }
            //handle other case
        };
    }

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

5.3最后需要在App类中注册适配器

        protected override void ConfigureRegionAdapterMappings(RegionAdapterMappings regionAdapterMappings)
        {
            base.ConfigureRegionAdapterMappings(regionAdapterMappings);

            regionAdapterMappings.RegisterMapping(typeof(StackPanel), Container.Resolve<StackPanelRegionAdapter>());
        }
  • 15
    点赞
  • 93
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: WPF Prism文档是指关于Prism框架的详细说明和使用指南的文件集。Prism是一种基于WPF(Windows Presentation Foundation)的开发框架,它旨在帮助开发人员设计和构建复杂的、可扩展的企业级WPF应用程序。 WPF Prism文档通过提供清晰的指导和实例,帮助开发人员学习和理解如何正确地使用Prism框架。这些文档通常包含Prism框架的基本概念、设计模式和最佳实践。在这些文档中,开发人员可以了解到如何将应用程序分解为模块,如何使用依赖注入来管理应用程序的组件和模块之间的依赖关系,以及如何使用事件聚合器进行模块间的通信等等。 此外,WPF Prism文档还提供大量的示例代码和实用的代码片段,帮助开发人员快速理解和运用Prism框架的功能。这些示例代码涵盖了Prism框架各个方面的应用,包括注册模块、导航和区域管理、命令和互动、模块间通信等等,以满足不同开发需求的应用程序场景。 通过阅读WPF Prism文档,开发人员可以更好地理解Prism框架的核心概念和设计原则,从而更高效地构建可维护、可扩展的WPF应用程序。这些文档也可以作为学习和培训的参考资料,帮助新手快速入门,并且帮助有经验的开发人员进一步提升他们的技术水平。 总之,WPF Prism文档是一份宝贵的资源,为开发人员提供了全面的指导和实例,帮助他们掌握和运用Prism框架,以构建高质量的WPF应用程序。 ### 回答2: WPF Prism文档是指Prism开源框架的相关文档。Prism是一种用于构建模块化、可扩展、高效、可测试且易于维护的WPF应用程序的框架。Prism的文档提供了详细的指导和说明,帮助开发人员快速上手并正确地使用Prism框架。 WPF Prism文档通常包含以下内容:框架的介绍和概述,包括它的设计理念、优势以及使用场景;安装和配置指南,指导开发人员如何在他们的项目中引入和配置Prism;架构和模块化概念的介绍,帮助开发人员理解Prism框架的核心思想;关于如何创建和组织模块的指导,包括如何定义和加载模块,如何使用导航和呈现模块的方式等;还包括关于依赖注入、命令和事件聚合器等核心概念的详细解释和用法示例。 此外,WPF Prism文档还通常包含一些实用的示例代码,以帮助开发人员更好地理解和运用框架的特性和功能。这些示例可以涵盖从简单的模块创建到复杂的UI导航和模块通信的各个方面。 总而言之,WPF Prism文档通过提供详细的指南、解释和示例代码,帮助开发人员了解和使用Prism框架,以便有效地构建出高质量、可维护和可扩展的WPF应用程序。 ### 回答3: WPF Prism文档是Prism框架的官方文档,用于帮助开发人员理解和使用Prism框架。Prism是一个用于开发模块化、可扩展和可重用的WPF应用程序的开源框架。 WPF Prism文档包含了Prism框架的完整说明和指南,涵盖了框架的核心概念、设计原则和使用方法。文档详细介绍了Prism框架的各个组件,如模块化、导航、命令、事件聚合器等,并提供了示例代码和详细解释,帮助开发人员快速上手和理解框架。 在WPF Prism文档中,开发人员可以了解到Prism框架的优点和适用场景,了解如何将Prism集成到自己的WPF应用程序中,并利用框架提供的功能和工具来简化开发过程。文档还介绍了Prism的相关概念和模式,如依赖注入、解耦和松耦合等,帮助开发人员遵循最佳实践和设计原则,构建出高质量和可维护的应用程序。 除了框架的详细说明和指南,WPF Prism文档还包含了一些常见问题和解决方案,帮助开发人员解决在使用Prism框架时遇到的困难和问题。文档还提供了一些扩展和相关资源的链接,帮助开发人员深入学习和探索Prism框架的更多功能和扩展。 总之,WPF Prism文档是Prism框架的权威指南,对于希望使用Prism框架开发WPF应用程序的开发人员来说,它是一个不可或缺的参考资料。通过学习和理解WPF Prism文档,开发人员能够更加高效和灵活地开发出优秀的WPF应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值