zoukankan      html  css  js  c++  java
  • 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);
            }
        }
    }
    
    
    登峰造极的成就源于自律
  • 相关阅读:
    leetcode -- Merge Two Sorted Lists
    leetcode -- Rotate List
    leetcode -- Merge Intervals
    leetcode -- Insert Interval
    Egret入门学习日记 --- 第八篇(书中 2.0~2.6节 内容)
    Egret入门学习日记 --- 第七篇(书中 3.9节 内容)
    Egret入门学习日记 --- 第五篇(书中 3.5节 内容)
    Egret入门学习日记 --- 第四篇(书中 3.1~3.3 内容)
    Egret入门学习日记 --- 第三篇 (书中 3.4 内容)
    Egret入门学习日记 --- 第二篇 (书籍的选择 && 书籍目录 && 书中 3.3 节 内容)
  • 原文地址:https://www.cnblogs.com/fishpond816/p/13467418.html
Copyright © 2011-2022 走看看