zoukankan      html  css  js  c++  java
  • Prism简化总结

    Prism简化流程

    创建入口-容器注册

    public MainWindow(IRegionManager regionManager)
    {
    	InitializeComponent();     
        
    	regionManager.RegisterViewWithRegion("ContentRegion",typeof(SumViews));
    }
    

    数据属性

    1. 引入using Prism.Commands名称控件
    2. 继承BindableBase接口
    3. 语法糖propp

    命令属性

    1. 引入using Prism.Commands名称空间

    2. 语法糖cmd

    3. 继承自ICommand接口,并且有三个函数成员

      1. CanExecuteChanged,事件CanExecuteChanged
      2. CanExecute,一个返回值bool的,且带一个参数为object的CanExecute方法
      3. Execute,一个无返回值且带一个参数为object的Execute方法
    4. 无参数:RaiseCanExecuteChanged方法就是内部调用ICommand接口下的CanExecuteChanged事件去调用CanExecute方法

     private bool _isCanExcute;
     public bool IsCanExcute
     {
        get { return _isCanExcute; }
        set { SetProperty(ref _isCanExcute, value);}
     }
    
     private DelegateCommand _getCurrentTimeCommand;
     public DelegateCommand GetCurrentTimeCommand =>
        _getCurrentTimeCommand ?? (_getCurrentTimeCommand = new  DelegateCommand(ExecuteGetCurrentTimeCommand).ObservesCanExecute(()=> IsCanExcute));
    
     void ExecuteGetCurrentTimeCommand()
     {
        this.CurrentTime = DateTime.Now.ToString();
     }
    

    容器与注册

    1. 引入Prism.Ioc和Prism.Regions名称空间
    2. 声明对应字段,IContainerExtension _container(容器)、IRegionManager _regionManager(容器管理器)、 IRegion _region(视图)
    3. 自动注册:regionManager.RegisterViewWithRegion("ContentRegion", typeof(SumViews));
    4. 手动注册(可激活或失效):
    //注册
    _sumViews = _container.Resolve<SumViews>();
    _region = _regionManager.Regions["ContentRegion"];
    _region.Add(_sumViews);
    //激活
    _region.Activate(_sumViews);
    //失效
    _region.Deactivate(_sumViews);
    

    模块化

    1. prism模板创建模块,并在内部初始化模块

      • 新增一个类ModuleAModule.cs实现IModule接口(每一个Module类都要实现这个接口,而每一个Module都要有这样一个类来对Module里的资源统一管理)
    public void OnInitialized(IContainerProvider containerProvider)
    {
    var regionManager = containerProvider.Resolve<IRegionManager>();
    regionManager.RegisterViewWithRegion("ContentRegion", typeof(ViewA));
    }
    
    1. 依赖项添加项目引用

    2. App.xaml.cs中注册模块,设置为按需加载

      1. 重载 ConfigureModuleCatalog(IModuleCatalog moduleCatalog)方法
      2. 发现模块, moduleCatalog.AddModule<ModuleA.ModuleAModule>()
    protected override void ConfigureModuleCatalog(IModuleCatalog moduleCatalog)
    {
      var moduleType = typeof(ModuleAModule);
      moduleCatalog.AddModule(new ModuleInfo()
      {
         ModuleName = moduleType.Name,
         ModuleType = moduleType.AssemblyQualifiedName,
         InitializationMode = InitializationMode.OnDemand,
       });
    }
    
    1. MainWondow.xaml.cs中加载模块
      1. 引入Prism.Modularity,名称空间
      2. 声明IModuleManager 类型对应字段
      3. 声明并加载 _moduleManager.LoadModule
     public partial class MainWindow : Window
        {
            IModuleManager _moduleManager;
    
            public MainWindow(IModuleManager moduleManager)
            {
                InitializeComponent();
                _moduleManager = moduleManager;
            }
    
            private void Button_Click(object sender, RoutedEventArgs e)
            {
                _moduleManager.LoadModule("ModuleAModule");
            }
        }
    

    导航Navigation

    1. 将view注册成Navication,并且注册到容器中
    public void RegisterTypes(IContainerRegistry containerRegistry)
    {
      containerRegistry.RegisterForNavigation<ViewA>();
      containerRegistry.RegisterForNavigation<ViewB>();
    }
    
    1. 设置带参数的Command命令
    //xaml
    <StackPanel Orientation="Horizontal" DockPanel.Dock="Top" Margin="5" >
    <Button Command="{Binding NavigateCommand}" CommandParameter="ViewA" Margin="5">Navigate to View A</Button>
    <Button Command="{Binding NavigateCommand}" CommandParameter="ViewB" Margin="5">Navigate to View B</Button>
    </StackPanel>
    //cs
    private readonly IRegionManager _regionManager;
    public DelegateCommand<string> NavigateCommand { get; private set; }
    public MainWindowViewModel(IRegionManager regionManager)
    {
    _regionManager = regionManager;
    NavigateCommand = new DelegateCommand<string>(Navigate);
    }
    private void Navigate(string navigatePath)
    {
    if (navigatePath != null)
    _regionManager.RequestNavigate("ContentRegion", navigatePath);
    }
    
    1. RegionManager通过RequestNavigate方法来获取已经注册的Navigation并且绑定到Region上去
    //当需要根据调用结果来处理一些事情,可以使用下面这个方法
    void RequestNavigate(string regionName, string source, Action<NavigationResult> 
    

    导航完成后获取通知Navigation Callback

     private void Navigate(string navigatePath)
    {
    if (navigatePath != null)
    _regionManager.RequestNavigate("ContentRegion", navigatePath, NavigationComplete);
    }
    private void NavigationComplete(NavigationResult result)
    {
    System.Windows.MessageBox.Show(String.Format("Navigation to {0} complete. ", result.Context.Uri));
    }
    

    RequestNavigate

     /// <summary>
    /// 导航指定的区域管理器
    /// </summary>
    /// <param  name="regionName">要调用导航的区域的名称</param>
    /// <param name="source">要显示内容的URI</param>
    /// <param name="navigationCallback">导航的回调方法</param>
    void RequestNavigate(string regionName, string source, Action<NavigationResult> 
    

    对话框

    在Prism中,通过一个IDialogAware接口来实现对话框服务:

    Copypublic interface IDialogAware
    {
        bool CanCloseDialog();
        void OnDialogClosed();
        void OnDialogOpened(IDialogParameters parameters);
        string Title { get; set; }
        event Action<IDialogResult> RequestClose;
    }
    
    • CanCloseDialog()函数是决定窗体是否关闭
    • OnDialogClosed()函数是窗体关闭时触发,触发条件取决于CanCloseDialog()函数
    • OnDialogOpened()函数时窗体打开时触发,比窗体Loaded事件早触发
    • Title为窗体的标题
    • RequestClose为关闭事件,可由此控制窗体的关闭
    登峰造极的成就源于自律
  • 相关阅读:
    类的自动载入
    设计模式的概述
    laravel开发微信公众号1 之基本配置
    laravel 中 与前端的一些事5 之解决缓存问题:version
    laravel 中 与前端的一些事4 之合并压缩静态文件
    H3C AR28-31路由器组网实验
    二分查找找一个数所在的范围
    从Code::Blocks到Dev–C++,Dev-C++安装调试一条龙
    Code::Blocks使用与调试一条龙
    JSP相对路径与绝对路径探秘
  • 原文地址:https://www.cnblogs.com/fishpond816/p/13467435.html
Copyright © 2011-2022 走看看