1-6注册View Prism官网案例学习

声明

原文出处如下:

作者:RyzenAdorer 内容简介:Prism医疗案例

作者:可是我爱你啊 内容简介:Prism官方案例的学习分享

Prism官网开发文档

容器相关知识的学习

Microsoft官方文档

这是一篇记录作者学习Prism的随笔,该随笔的内容是作者通过5个资源学习汇总而成,主要是为了方便自己以后拾遗温习所用,如果文中内容看不懂,推荐直接阅读相关原文。

Prism官网案例学习

01-创建一个基本的引导程序和外壳

引入命名空间

  • 导航到App.xaml然后将标准WPF应用程序类替换为Prism PrismApplication类。
  • 不要忘记StartupUriPrismApplication标记中删除属性。否则,您将获得两个窗口实例。
<prism:PrismApplication
    x:Class="WpfApp1.App"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:WpfApp1"
    xmlns:prism="http://prismlibrary.com/">
    <Application.Resources>
    </Application.Resources>
</prism:PrismApplication>

继承抽象方法

导航到App.xaml.cs中并更新类定义,PrismApplication首先定义了一对抽象方法:RegisterTypes和CreateShell。

RegisterTypes-注册类型(依赖注入)

CreateShell-入口函数

必须实现的第二种方法是CreateShell方法。这是将创建应用程序主窗口的方法。应该使用App类的Container属性来创建窗口,因为它可以处理所有依赖项。

02 03-Regions

Regions-创建一个区域

Regions是应用程序UI的逻辑区域,它很像一个PlaceHolder,Views在Regions中展现,很多种控件可以被用作Region :ContentControl、ItemsControl、ListBox、TabControl。

简单的说,就是一个容器(区域适配器),用来装载Views的。这像WinForms中的Container控件Panel,里面可以放置其他控件。在PRISM中,Views也是用户控件(UserControl

参考05-Prism系列之区域管理器

<ContentControl Grid.Row="2" prism:RegionManager.RegionName="PatientListRegion" Margin="10"/>
//后台代码:RegionManager.SetRegionName(ContentControl, "PatientListRegion");

Custom Region Adapter- 为StackPanel创建一个自定义区域适配器

  1. 创建自定义适配器,继承 RegionAdapterBase,实现对应方法

    using Prism.Regions;
    using System.Windows;
    using System.Windows.Controls;
    
    namespace Regions
    {
        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 == System.Collections.Specialized.NotifyCollectionChangedAction.Add)
                    {
                        foreach (FrameworkElement element in e.NewItems)
                        {
                            regionTarget.Children.Add(element);
                        }
                    }
    
                    //handle remove
                };
            }
    
            protected override IRegion CreateRegion()
            {
                return new AllActiveRegion();
            }
        }
    }
    
    
  2. 注册映射

  3. 为控件创建区域

  4. 为区域注入视图

04 05 06 - 注册View

视图注册的两种方法

我们可以明显的感觉到两种方式的不同,ViewDiscovery方式是自动地实例化视图并且加载出来,而ViewInjection方式则是可以手动控制注入视图和加载视图的时机(上述例子是通过Loaded事件),官方对于两者的推荐使用场景如下:

ViewDiscovery

  • 需要或要求自动加载视图
  • 视图的单个实例将加载到该区域中

ViewInjection

  • 需要显式或编程控制何时创建和显示视图,或者您需要从区域中删除视图
  • 需要在区域中显示相同视图的多个实例,其中每个视图实例都绑定到不同的数据
  • 需要控制添加视图的区域的哪个实例
  • 应用程序使用导航API(后面会讲到)

View Discovery-注册方法一:使用View Discovery自动注入视图

  1. 创建用户视图ViewA

  2. 注册视图

     public MainWindow(IRegionManager regionManager)
            {
                InitializeComponent();
                //view discovery 注册视图
                regionManager.RegisterViewWithRegion("ContentRegion", typeof(ViewA));
            }
    

View Injection-注册方法二:使用View Injection手动添加和删除视图

namespace ViewInjection.Views
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml MainWindow.xaml的交互逻辑
    /// </summary>
    public partial class MainWindow : Window
    {
        IContainerExtension _container; //声明对应字段
        IRegionManager _regionManager;//声明对应字段

        public MainWindow(IContainerExtension container, IRegionManager regionManager)
        {
            InitializeComponent();
            _container = container;
            _regionManager = regionManager;
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            //手动注册
            var view = _container.Resolve<ViewA>();
            IRegion region = _regionManager.Regions["ContentRegion"];
            region.Add(view);
        }
    }
}

View Activation/Deactivation- 手动激活和停用视图

using Unity;
using Prism.Regions;
using System.Windows;
using Prism.Ioc;

namespace ActivationDeactivation.Views
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        IContainerExtension _container; //容器扩展
        IRegionManager _regionManager;//区域管理器
        IRegion _region;//区域

        ViewA _viewA;//视图A
        ViewB _viewB;//视图B

        public MainWindow(IContainerExtension container, IRegionManager regionManager)
        {
            InitializeComponent();
            _container = container;
            _regionManager = regionManager;

            this.Loaded += MainWindow_Loaded;
        }

        private void MainWindow_Loaded(object sender, RoutedEventArgs e)
        {
            _viewA = _container.Resolve<ViewA>();//解析视图A
            _viewB = _container.Resolve<ViewB>();//解析视图B

            _region = _regionManager.Regions["ContentRegion"];//区域管理器

            _region.Add(_viewA);//添加视图
            _region.Add(_viewB);
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            //activate view a
            _region.Activate(_viewA);//区域 活性化 视图A
        }

        private void Button_Click_1(object sender, RoutedEventArgs e)
        {
            //deactivate view a
            _region.Deactivate(_viewA); //区域 使不活性化 视图A
        }

        private void Button_Click_2(object sender, RoutedEventArgs e)
        {
            //activate view b
            _region.Activate(_viewB);
        }

        private void Button_Click_3(object sender, RoutedEventArgs e)
        {
            //deactivate view b
            _region.Deactivate(_viewB);
        }
    }
}

posted @ 2020-08-10 01:43  AJun816  阅读(414)  评论(0编辑  收藏  举报