Prism简化总结
Prism简化流程
创建入口-容器注册
public MainWindow(IRegionManager regionManager)
{
InitializeComponent();
regionManager.RegisterViewWithRegion("ContentRegion",typeof(SumViews));
}
数据属性
- 引入using Prism.Commands名称控件
- 继承BindableBase接口
- 语法糖propp
命令属性
-
引入using Prism.Commands名称空间
-
语法糖cmd
-
继承自ICommand接口,并且有三个函数成员
- CanExecuteChanged,事件CanExecuteChanged
- CanExecute,一个返回值bool的,且带一个参数为object的CanExecute方法
- Execute,一个无返回值且带一个参数为object的Execute方法
-
无参数: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();
}
容器与注册
- 引入Prism.Ioc和Prism.Regions名称空间
- 声明对应字段,IContainerExtension _container(容器)、IRegionManager _regionManager(容器管理器)、 IRegion _region(视图)
- 自动注册:regionManager.RegisterViewWithRegion("ContentRegion", typeof(SumViews));
- 手动注册(可激活或失效):
//注册
_sumViews = _container.Resolve<SumViews>();
_region = _regionManager.Regions["ContentRegion"];
_region.Add(_sumViews);
//激活
_region.Activate(_sumViews);
//失效
_region.Deactivate(_sumViews);
模块化
-
prism模板创建模块,并在内部初始化模块
- 新增一个类
ModuleAModule.cs
实现IModule接口(每一个Module类都要实现这个接口,而每一个Module都要有这样一个类来对Module里的资源统一管理)
- 新增一个类
public void OnInitialized(IContainerProvider containerProvider)
{
var regionManager = containerProvider.Resolve<IRegionManager>();
regionManager.RegisterViewWithRegion("ContentRegion", typeof(ViewA));
}
-
依赖项添加项目引用
-
App.xaml.cs中注册模块,设置为按需加载
- 重载 ConfigureModuleCatalog(IModuleCatalog moduleCatalog)方法
- 发现模块, 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,
});
}
- MainWondow.xaml.cs中加载模块
- 引入Prism.Modularity,名称空间
- 声明IModuleManager 类型对应字段
- 声明并加载 _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
- 将view注册成Navication,并且注册到容器中
public void RegisterTypes(IContainerRegistry containerRegistry)
{
containerRegistry.RegisterForNavigation<ViewA>();
containerRegistry.RegisterForNavigation<ViewB>();
}
- 设置带参数的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);
}
- 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为关闭事件,可由此控制窗体的关闭
登峰造极的成就源于自律