实验目的
准备工作
本实验需要如下Prism类库中的程序集:
Prism类库以源码方式发布,请编译源码获取程序集。
实验步骤
包括以下任务:
任务1:创建基于Prism类库的解决方案
按如下步骤创建该解决方案:
如何设置Shell
< UserControl x:Class = " HelloWorld.Silverlight.Shell "
xmlns = " http://schemas.microsoft.com/winfx/2006/xaml/presentation "
xmlns:x = " http://schemas.microsoft.com/winfx/2006/xaml "
Width = " 400 " Height = " 300 " >
< Grid x:Name = " LayoutRoot " Background = " White " >
</ Grid >
</ UserControl >
区域Regions
下面步骤介绍如何添加一个ItemsControl控件并关联到一个区域Region。
xmlns:Regions = " clr-namespace:Microsoft.Practices.Composite.Presentation.Regions;assembly=Microsoft.Practices.Composite.Presentation "
< UserControl x:Class = " HelloWorld.Silverlight.Shell "
xmlns = " http://schemas.microsoft.com/winfx/2006/xaml/presentation "
xmlns:x = " http://schemas.microsoft.com/winfx/2006/xaml "
xmlns:Regions = "clr-namespace:Microsoft.Practices. Composite.Presentation.Regions;assembly=Microsoft.Practices.Composite.Presentation "
Width = " 400 " Height = " 300 " >
< ItemsControl Name = " MainRegion " />
</ UserControl >
< ItemsControl Name = " MainRegion " Regions:RegionManager.RegionName = " MainRegion " />
在Shell实例化之后,Silverlight会解析附加属性Regions:RegionManager.RegionName的值,以回调RegionManager类。该回调过程创建了一个区域Region及与之相关的一个ItemsControl控件。
启动引导器BootStrapper
启动引导器负责初始化基于Prism的应用程序。包括UnityBootstrapper 和MefBootstrapper两种。你也可以实现自己的特定容器的启动引导器。
下面介绍如何设置启动引导器Bootstrapper:
using Microsoft.Practices.Composite.Modularity;
using Microsoft.Practices.Composite.UnityExtensions;
using Microsoft.Practices.Unity;
class Bootstrapper : UnityBootstrapper
{
}
protected override DependencyObject CreateShell()
{
return Container.Resolve < Shell > ();
}
protected override void InitializeShell()
{
base .InitializeShell();
Application.Current.RootVisual = (UIElement) this .Shell;
}
protected override void ConfigureModuleCatalog()
{
base .ConfigureModuleCatalog();
}
private void Application_Startup( object sender, StartupEventArgs e)
{
Bootstrapper bootstrapper = new Bootstrapper();
bootstrapper.Run();
}
任务2:添加模块
包括两个子任务:
创建模块
using Microsoft.Practices.Composite.Modularity;
public class HelloWorldModule : IModule
{
}
public void Initialize()
{
}
到此,我们建立了一个基于Prism的模块项目,下面继续介绍如何加载这些模块。
应用程序寿命周期中的模块
在应用程序寿命周期中,模块经历了以下三个步骤:
构建模块目录
Prism提供了几种方式用于构建模块目录。Silverlight中可以通过编码方式或者XAML方式来实现模块目录。
以下为构建模块目录的步骤:
protected override void ConfigureModuleCatalog()
{
base .ConfigureModuleCatalog();
}
ModuleCatalog类用于应用程序以代码的方式来定义模块。它实现了IModuleCatalog接口方法和AddModule方法,帮助开发者手动注册模块以便被应用程序加载
public ModuleCatalog AddModule(Type moduleType, InitializationMode initializationMode, params string[] dependsOn)
AddModule方法返回ModleCatalog实例,但需要以下参数输入
protected override void ConfigureModuleCatalog()
{
base .ConfigureModuleCatalog();
ModuleCatalogmoduleCatalog = (ModuleCatalog) this .ModuleCatalog;
moduleCatalog.AddModule( typeof (HelloWorldModule.HelloWorldModule));
}
任务4:添加一个视图
该任务将创建一个视图到HelloWorldModule模块项目中。视图(Views)指的是包含可视化内容的对象。视图一般是用户控件。添加视图步骤如下:
详细步骤如下
< 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 x:Name = " LayoutRoot " Background = " White " >
< TextBlock Text = " Hello World " Foreground = " Green "HorizontalAlignment = " Center " VerticalAlignment = " Center "FontFamily = " Calibri " FontSize = " 24 " FontWeight = " Bold " ></ TextBlock >
</ Grid >
</ UserControl >
本实验为求简单没有用MVVM模式来实现解决方案。
区域管理器Region Manager
区域管理器服务负责维护区域的集合,和为控件创建新区域。它实现了Microsoft.Practices.Composite.Regions.IRegionManager接口。使得我们可以通过区域名以解耦的方式来定位区域或者添加视图到区域中。默认情况下,UnityBootStrapper基类在应用程序容器中注册了一个区域管理器服务的实例。这样我们就可以通过依赖注入的方式获取区域管理器服务的引用。
下面介绍如何在Shell中展现视图
using Microsoft.Practices.Composite.Regions;
private readonly IRegionManager regionManager;
public HelloWorldModule(IRegionManager regionManager)
{
this .regionManager = regionManager;
}
public void Initialize()
{
regionManager.RegisterViewWithRegion(" MainRegion " , typeof (Views.HelloWorldView));
}
以上步骤实现了视图发现方法,使用该方法时,需要制定视图和加载视图的区域。当区域被创建之后,它就会要求查找并自动加载相关的视图。