在现代软件开发中,模块化设计是一种常见的架构模式,它有助于提高应用程序的灵活性、可维护性和测试性。Prism框架正是为了实现这种模块化设计而诞生的。它允许开发者将应用程序分解为多个功能单元,这些单元可以独立开发、测试和部署。本文将通过一个示例应用程序,展示如何使用Prism框架来构建一个WPF应用程序。
本文以一个展示虚构员工资料的示例应用程序为基础,介绍Prism框架在WPF中的应用。这个示例项目可以从GitHub上克隆或下载。该应用程序包含四个项目:一个WPF应用程序项目、一个包含共享代码的类库,以及两个Prism模块。
设置Prism项目最简单的方法是先安装Visual Studio的Prism Template Pack扩展,并利用Prism项目模板。示例应用程序的主项目是使用Prism Blank App (WPF)模板创建的,而模块则是使用Prism Module (WPF)模板添加的。
Prism应用程序由一个外壳(shell)组成,它托管应用程序的所有视觉组件。在Prism中,默认情况下,应用程序的外壳是MainWindow。外壳包含一个或多个区域(regions),模块可以将视图注入到这些区域中,而视图本身也可以包含区域,以便放置其他视图。
要将视图放置到区域中,模块需要使用RegionManager,它负责跟踪应用程序中的所有区域。示例应用程序中只有一个名为ContentRegion的区域。以下XAML代码展示了如何在MainWindow中定义这个区域:
<mah:MetroWindow x:Class="StaffStuff.Views.MainWindow"
...
xmlns:prism="http://prismlibrary.com/"
xmlns:common="clr-namespace:StaffStuff.Common;assembly=StaffStuff.Common"
xmlns:mah="http://metro.mahapps.com/winfx/xaml/controls"
...
prism:ViewModelLocator.AutoWireViewModel="True">
...
<Grid>
<ContentControl prism:RegionManager.RegionName="{x:Static common:RegionNames.ContentRegion}" />
</Grid>
</mah:MetroWindow>
示例应用程序有两个视图:一个用户控件显示包含一些员工详细信息的卡片,另一个用户控件显示特定员工的更多详细信息。这两个视图都位于名为UIModule的模块中。UIModule实现了Prism的IModule接口,该接口有两个方法:一个在模块初始化时调用,另一个用于类型注册。
每个视图都设置了一个数据上下文,即视图模型,它通过Prism的ViewModelLocator与视图关联。Prism使用默认约定将视图模型与视图关联起来,该约定假设视图模型与视图在同一个程序集中;在视图的.ViewModels子命名空间中;名称与视图名称相对应;并且相应的视图在.Views子命名空间中。(如果更喜欢使用不同的约定,可以指定自定义的。)UI模块有两个视图模型,每个视图模型都与特定的视图相关联。
在示例应用程序中,模块需要在Prism的ModuleCatalog中注册,以便应用程序可以加载它们。这在App.xaml.cs中完成。
public partial class App
{
...
protected override void ConfigureModuleCatalog(IModuleCatalog moduleCatalog)
{
moduleCatalog.AddModule<ServicesModule>();
moduleCatalog.AddModule<UIModule>();
}
}