WPF MVVM实战系列教程(三、创建Bootstrapper/启动器)

🧭 WPF MVVM入门系列教程


🍠 WPF MVVM进阶系列教程


⌨️ WPF MVVM实战系列教程



WPF的启动过程

因为在前面的文章中,我还没有介绍到WPF程序的启动过程,所以这里简单介绍一下WPF的启动过程

一个正常的WPF启动流程如下:

 1 public partial class App : Application
 2 {
 3     [STAThread]
 4     public static void Main()
 5     {
 6         App app = new App();
 7         app.InitializeComponent();
 8         app.Run();
 9     }
10 
11     public void InitializeComponent()
12     {
13         this.StartupUri = new Uri("MainWindow.xaml",UriKind.Relative);
14     }
15 }

通过设置Application.StartupUri属性来设置启动的窗口。

上述的代码是手动创建窗口时的逻辑,正常情况下,WPF已经帮我们创建好了App.xaml

并且在App.xaml中指定了StartupUri

1 <Application x:Class="WpfApp23.App"
2              xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
3              xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
4              xmlns:local="clr-namespace:WpfApp23"
5              StartupUri="MainWindow.xaml">
6     <Application.Resources>
7          
8     </Application.Resources>
9 </Application>

我们可以理解为在App类完成WPF的初始化工作。

后续我会详细介绍Application类,这里仅做简单讲解,有疑问的小伙伴,可以访问下面的链接进行学习:

https://learn.microsoft.com/zh-cn/dotnet/desktop/wpf/app-development/application-management-overview

 

什么是Bootstrapper

在Prism中,我们会引入一个新的概念,Bootstrapper。我们也可以称之为启动器。

目前我们可以不用具体掌握它的全部职责,后面会详细介绍到。

现阶段只要了解,在使用Prism框架后,我们需要调整原来Application类的启动逻辑,以便完成一些Prism的初始化工作。

 

 

Bootstrapper的职责如下

初始化容器(Container)

Prism 基于依赖注入(DI)设计,Bootstrapper 首先会创建并配置 DI 容器(默认是 Unity/Autofac 等),这是 Prism 实现松耦合、模块化的核心。
它会自动注册 Prism 框架的核心服务(如IRegionManager、IEventAggregator),也支持你注册自定义服务。


配置模块(Module)
负责发现、加载和初始化应用的模块化组件(Module)。你可以通过 Bootstrapper 指定模块的加载方式(按需加载 / 启动时加载)、模块所在程序集等,实现模块化开发的核心逻辑。

 

创建并配置 Shell(主窗口)
Shell 是 WPF Prism 应用的主窗口,Bootstrapper 会从 DI 容器中解析 Shell 实例,设置为应用的主窗口,并完成窗口的初始化(如关联 RegionManager、绑定视图模型等)。

自动初始化 Prism 的关键服务
IRegionManager:管理视图区域(Region),实现视图的动态加载 / 切换;
IEventAggregator:实现模块间的无耦合通信;
IDialogService:统一管理对话框;
INavigationService:实现视图导航。

这里的初始化是指创建对应的实例,并注入到DI容器中,这个过程是在内部进行的,不需要我们进行干预。


启动应用
完成所有初始化后,Bootstrapper 会显示 Shell 主窗口,正式启动应用程序。

 

创建Bootstrapper的两种方式

方式1、代码创建Bootstrapper类

创建步骤如下:

1、创建一个Bootstrapper类

 1    public class Bootstrapper : PrismBootstrapper
 2    {
 3        protected override DependencyObject CreateShell()
 4        {
 5            return Container.Resolve<MainWindow>();
 6        }
 7 
 8        protected override void RegisterTypes(IContainerRegistry containerRegistry)
 9        {
10 
11        }
12    }

可以看到Bootstrapper类的构成:

Bootstrapper里重写了CreateShellRegisterTypes两个函数

CreateShell函数的作用是创建程序外壳(主界面)

RegisterTypes的作用是注册类型到容器中(这个后面会详细介绍)

 

2、移除App.xaml中的StartupUri

image

 

3、在App.cs中重写Startup函数,并运行Bootstrapper

 1  public partial class App : Application
 2  {
 3      protected override void OnStartup(StartupEventArgs e)
 4      {
 5          base.OnStartup(e);
 6 
 7          var bootstrapper = new Bootstrapper();
 8          bootstrapper.Run();
 9      }
10  }

 

 

方式2、XAML创建PrismApplication类

创建步骤如下:

1、在App.xaml中引入命名空间前缀

1    xmlns:prism="http://prismlibrary.com/"

 

2、将App.xaml的根节点由Application替换为prism:PrismApplication

 1 <prism:PrismApplication x:Class="Prism_CreateBootstrapper_XAML.App"
 2              xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
 3              xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
 4              xmlns:local="clr-namespace:Prism_CreateBootstrapper_XAML"
 5              xmlns:prism="http://prismlibrary.com/">
 7     <Application.Resources>
 8          
 9     </Application.Resources>
10 </prism:PrismApplication>

注意:这里依旧需要移除StartupUri

 

3、将App类修改为继承自PrismApplication并重写函数

 1 public partial class App : PrismApplication
 2 {
 3     protected override Window CreateShell()
 4     {
 5         return Container.Resolve<MainWindow>();
 6     }
 7 
 8     protected override void RegisterTypes(IContainerRegistry containerRegistry)
 9     {
10 
11     }
12 }

App类中的逻辑和前面创建Bootstrapper类是一样的。

在文章的开头部分我介绍了App类的内部逻辑,这种方式就是借助了原来的流程。

这样我们就拥有了一个Prism的启动器。

这两种方式根据个人需求选择其中一种即可。

下一篇文章中,我将会详细介绍Bootstrapper的职责。

 

示例代码

https://github.com/zhaotianff/WPF-MVVM-Beginner/tree/main/11_Prism_CreateBootstrapper

posted @ 2025-11-24 11:38  zhaotianff  阅读(92)  评论(0)    收藏  举报