说明
使用的安装包有:
- Prism 6.3
- Unity 4.0.1
基于Prism框架的应用程序都包含一个主项目和若干功能模块,主项目负责启动时初始化工作,包括依赖注入容器,定义Shell等等。功能模块则负责单独的逻辑功能。下面使用helloworld说明。
1. 安装
新建WPF项目,使用4.5 版 .NET Framework。安装如下安装包。
Install-Package Prism.Unity
2. 编写主项目
2.1 定义Shell
删除MainWindow.Xaml文件,并新增Shell.Xaml文件。Shell是主界面,包含一个多个域(Region),每个域是一个容器,可存放一个或多个自定义组件,这里使用ItemsControl实现。定义域时需要指明域名称。
xaml
<Window x:Class="HelloWorld.Shell"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:prism="http://prismlibrary.com/"
Title="Hello World" Height="300" Width="300">
<ItemsControl Name="MainRegion" prism:RegionManager.RegionName="MainRegion" />
</Window>
behind code
using System.Windows;
namespace HelloWorld
{
/// <summary>
/// Interaction logic for Shell.xaml
/// </summary>
public partial class Shell : Window
{
public Shell()
{
InitializeComponent();
}
}
}
2.2 创建Bootstrapper
所谓Bootstrapper可以简单理解为创建Prism项目的引导程序,该引导程序需要做多项工作,这里不详细讲述。BootStrapper初始化。
using System.Windows;
using Microsoft.Practices.Unity;
using Prism.Unity;
namespace HelloWorld
{
class HelloBootstrapper : UnityBootstrapper
{
protected override DependencyObject CreateShell()
{
return this.Container.Resolve<Shell>();
}
protected override void InitializeShell()
{
base.InitializeShell();
App.Current.MainWindow = (Window)this.Shell;
App.Current.MainWindow.Show();
}
protected override void ConfigureModuleCatalog()
{
base.ConfigureModuleCatalog();
}
}
2.3 启动Bootstrapper
在App.xaml.cs中重写程序启动事件处理句柄,在原有处理上追加实例化Bootstrapper,启动。
public partial class App : Application
{
protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);
Bootstrapper bootstrapper = new Bootstrapper();
bootstrapper.Run();
}
}
3. 模块化开发
Prism最大好处就是模块化开发,为此需要先定义一个模块。
3.1 定义功能模块
每一个模块包含一个或多个View,为了演示方便这里定义一个view。步骤:
- 新增一个HelloWorldModule项目
- 安装Prism.Unity包
- 在新增项目新建Views文件夹,并在Views文件夹中添加HelloWorldView.Xaml文件
xaml
<UserControl x:Class="HelloWorldModule.Views.HelloWorldView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Grid>
<TextBlock Text="Hello World" Foreground="Green" HorizontalAlignment="Center" VerticalAlignment="Center" FontFamily="Calibri" FontSize="24" FontWeight="Bold"></TextBlock>
</Grid>
</UserControl>
behind code
namespace HelloWorldModule.Views
{
/// <summary>
/// Interaction logic for HelloWorldView.xaml
/// </summary>
public partial class HelloWorldView : UserControl
{
public HelloWorldView()
{
InitializeComponent();
}
}
}
3.2 模块封装
定义好view以后我们需要将Views封装为一个模块,方法是定义模块 类并实现接口IModule。
using Microsoft.Practices.Prism.Modularity;
using Microsoft.Practices.Prism.Regions;
namespace HelloWorldModule
{
public class HelloWorldModule : IModule
{
private readonly IRegionViewRegistry regionViewRegistry;
public HelloWorldModule(IRegionViewRegistry registry)
{
this.regionViewRegistry = registry;
}
public void Initialize()
{
//将view注册在MainRegion域
regionViewRegistry.RegisterViewWithRegion("MainRegion", typeof(Views.HelloWorldView));
}
}
}
4. 导入模块
前面定义的模块是独立项目,为了让主项目找到该模块,需要将独立模块导入主项目中,方法是在模块目录添加该模块,Prism会找到该模块。在bootstrapper中使用如下代码导入。
//添加命名空间
using Microsoft.Practices.Prism.Modularity;
//将模块注册至模块目录
protected override void ConfigureModuleCatalog()
{
base.ConfigureModuleCatalog();
ModuleCatalog moduleCatalog = (ModuleCatalog)this.ModuleCatalog;
moduleCatalog.AddModule(typeof(HelloWorldModule.HelloWorldModule));
}