官网:https://primslibrary.com
源码地址:https://guthub.com/PrismLibrary/prism
Prism最初是由微软开发的,旨在帮助开发人员创建可维护和可扩展的WPF(Windows Presentation Foundation)应用程序。随着时间的推移,Prism的开发和维护转移到了社区,成为一个开源项目。提供了一组设计模式的实现,有助于编写结构良好的且可维护的XAML应用程序,包括MVVM、依赖注入、命令、事件聚合器等。
关键程序集
Prism.Core
:实现MVVM的核心功能,是一个与平台无关的项目,可以在多个开发平台中使用(Prism.dll
)。
- 如果只需要实现MVVM中的一些简单功能、例如属性变化通知、命令等,只需要在Nuget中安装
Prism.Core
库即可。
Prism.Wpf
:包含了DialogService
、Region
、Module
、Navigation
和其他一些WPF功能,使得WPF开发更加方便快捷(Prism.Wpf.dll
)。
- 如果需要进一步使用WPF中的一些其他功能,可以在Nuget中安装
Prism.Wpf
库,由于Prism.Wpf
依赖于Prism.Core
因此,无需再安装Prism.Core
。
Prism.Unity
:包含Prism.Unity.Wpf.dll
、Prism.DryIoc.Wpf.dll
。
-
如果需要使用IOC,则需要安装
Prism.Unity
,由于Prism.Unity
依赖于Prism.Wpf
,因此安装Prism.Unity
后不需要再安装Prism.Wpf
和Prism.Core
正常情况下,我们在Prism框架中都会使用IOC容器,直接在Nuget中下载
Prism.Unity
依赖库即可。
初始化
Prism框架项目的初始化,可以使用两种启动器类型来进行,分别是PrismBootstrapper
和PrismApplication
。
一、PrismBootstrapper
使用PrismBootstrapper
来进行WPF项目的初始化,需要通过PrismBootstrapper
对象来进行项目的启动。
PrismBootstrapper
进行项目的启动,主要是为了通过PrismBootstrapper
对象来进行项目IOC容器的初始化,为后续IOC容器管理对象做基础。
要通过PrismBootstrapper
来启动项目,首先要创建一个PrismBootstrapper
的子类,并实现两个方法成员:
DependencyObject CreateShell()
:进行主窗口对象的创建。- 主窗口对象需要通过
Container.Resolve<MainWindow>()
来创建。
- 主窗口对象需要通过
void RegisterTypes(IContainerRegistry containerRegistry)
:这个函数主要用于进行IOC容器管理类型的注册。
最终在App后台代码中调用PrismBootstrapper
对象的Run()
方法来启动项目
Run()
:PrismBootstrapperBase
的实例方法,用于初始化、启动IOC容器、展示窗口等操作。
启动步骤如下
创建启动类
public class Bootstrapper : PrismBootstrapper
{
protected override DependencyObject CreateShell()
{
//创建并返回一个主窗口对象
return Container.Resolve<MainWindow>();
}
protected override void RegisterTypes(IContainerRegistry containerRegistry)
{
//这个函数中进行一些类型注册
}
}
消除App.xaml的启动属性
<Application x:Class="Command.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:Command">
<!--这里消除掉了原有的 StartupUri="MainWindow.xaml" 属性-->
<Application.Resources>
</Application.Resources>
</Application>
在App后台代码中通过PrismBootstrapper
来启动项目
public partial class App : Application
{
public App()
{
new Bootstrapper().Run();
}
}
二、PrismApplication
使用PrismApplication
来进行项目启动,在步骤上会相对简单一些,具体如下:
修改App.xaml
将顶级元素Application
修改为prism:PrismApplication
。
去除启动属性StartupUri="MainWindow.xaml”
。
<prism:PrismApplication x:Class="Command.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:Command"
xmlns:prism="http://prismlibrary.com/">
<Application.Resources>
</Application.Resources>
</prism:PrismApplication>
修改App后台代码
继承PrismApplication
类并实现CreateShell
和RegisterTypes
两个方法,其用法跟上文中的PrismBootstrapper
是一样的。
有一点需要注意,App
类型在继承了PrismApplication
类后可能会提示错误,但是没有提示要实现方法,此时重新生成一下代码就会由提示了。
public partial class App : PrismApplication
{
protected override Window CreateShell()
{
//创建主窗口对象
return Container.Resolve<MainWindow>();
}
protected override void RegisterTypes(IContainerRegistry containerRegistry)
{
//这里进行IOC容器管理类型的注册
}
}
PS:此后的章节中,都以PrismApplication
启动作为基础进行学习。
三、基于Prism框架的登录跳转
在进行桌面应用开发时,从登录窗口跳转到主窗口的操作极为常见的,在Prism框架下,登录跳转的具体操作可以通过重写InitializeShell
方法来实现(这里以PrismApplication
启动为例)。
InitializeShell(Window shell)
:PrismApplication
类型的实例方法,在初始化Shell(主窗口)的时候执行。
public partial class App : PrismApplication
{
......
protected override void InitializeShell(Window shell)
{
//通过IOC容器来创建登录窗口
var login = Container.Resolve<Login>();
if (login == null || login.ShowDialog() == false)
{
//当登录失败或登录窗口关闭,则直接关闭应用
Application.Current.Shutdown();
}
else
{
base.InitializeShell(shell);
}
}
}
这里的Login
为登录窗口,中间有一个按钮,点击后将登录窗口的DialogResult
属性设置为true
并关闭登录窗口。