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为关闭事件,可由此控制窗体的关闭
posted @ 2020-08-10 01:55  AJun816  阅读(588)  评论(0编辑  收藏  举报