Prism研究(for WPF & Silverlight)4.从Hello World开始(实战篇)

      本篇将指导使用Prism框架创建一个WPF版本的Hello World程序。Silverlight版本的程序大同小异,不再敷述。

      相关内容请参见文档P127-147,代码示例参加Quickstarts\ Hello World目录。

      1.首先我们要准备Prism框架的6个dll,分别是:

· Microsoft.Practices.Composite.dll

· Microsoft.Practices.Composite.Presentation.dll

· Microsoft.Practices.Composite.UnityExtensions.dll

· Microsoft.Practices.ObjectBuilder2.dll

· Microsoft.Practices.ServiceLocation.dll

· Microsoft.Practices.Unity.dll

      你可以从LIB目录中直接找到这些dll,也可以编译CAL目录中的项目,然后在bin\debug目录下找到它们。将它们复制到一个目录下,以便我们可以在多个项目中方便地进行使用。同时,大家会看到很多xml文件,它们的名称和这些dll是相同的——最好把它们也一起复制过去,这些xml文件是用来在Visual Studio中做智能感知(IntelliSence)的。

      2.创建Shell

      创建一个名为HelloWorld.Desktop 的WPF应用程序。添加对上述所有dll的引用。然后删除默认的Window1.xaml,新建一个Shell.xaml。

      3.添加Region

      在Shell.xaml中添加对Prism命名空间的引用,如下所示:

xmlns:cal="http://www.codeplex.com/CompositeWPF"

      这样我们就可以为Region添加Prism中的依赖属性了。

      删除Grid标签,替换以ItemsControl,并将其命名为MainRegion:

<ItemsControl Name="MainRegion" cal:RegionManager.RegionName="MainRegion" />

      这里cal:RegionManager.RegionName是一个依赖属性,我们将它与ItemsControl控件相关联。

      修改后的Shell.xaml如下:

<Window x:Class="HelloWorld.Desktop.Shell"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:cal="http://www.codeplex.com/CompositeWPF"
    Title="Shell" Height="300" Width="300">
    <ItemsControl Name="MainRegion" cal:RegionManager.RegionName="MainRegion" />
</Window>

      4.添加Bootstarpper

      在HelloWorld.Desktop项目中添加一个名为Bootstarpper的类,这里覆写了CreateShell方法,以创建一个Shell窗体对象并显示:

class Bootstrapper : UnityBootstrapper
{
    protected override DependencyObject CreateShell()
    {
        Shell shell = new Shell();
        shell.Show();
        return shell;
    }
}

*注:这里要添加对一个命名空间的引用,才能使用UnityBootstrapper:

using Microsoft.Practices.Composite.UnityExtensions;

      5.修改App.xaml文件。

      在App.xaml文件里,删除Application标签中的:StartupUri="Window1.xaml"。在相应的后台文件App.xaml.cs中覆写OnStartup方法:

protected override void OnStartup(StartupEventArgs e)
{
    base.OnStartup(e);

    Bootstrapper bootstrapper = new Bootstrapper();
    bootstrapper.Run();
}

      6. 创建一个名为HelloWorldModule的类库,添加对Prism类库的其中2个dll的引用:

· Microsoft.Practices.Composite.dll

· Microsoft.Practices.Composite.Presentation.dll

      删除自动生成的class1.cs文件。

      7.在HelloWorldModule类库中创建一个文件夹,取名为Views,在这个文件夹中创建一个HelloWorldView.xaml,我们为这个xaml添加一个显示HelloWorld的TextBlock:

<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>

      8. 在HelloWorldModule类库中添加一个名为HelloWorldModule的类,它派生自IModule接口,为此我们要实现它的Initialize方法:

public class HelloWorldModule : IModule
{
    private readonly IRegionViewRegistry regionViewRegistry;

    public HelloWorldModule(IRegionViewRegistry registry)
    {
        this.regionViewRegistry = registry;   
    }

    public void Initialize()
    {
        regionViewRegistry.RegisterViewWithRegion("MainRegion", typeof(Views.HelloWorldView));
    }
}

      我们发现,在Initialize方法中,将前面第3步指定的MainRegion与文件夹Views中HelloWorldView类(这是一个xaml)的相关联。

      同时,这里提及一句,我们使用了依赖注入(构造函数)的方式,来传递参数regionViewRegistry。

      9.返回到HelloWorld.Desktop应用程序中,添加对HelloWorldModule类库的引用。

      10.最后,返回到第4步创建的Bootstarpper中,我们还要覆写它的GetModuleCatalog方法,从而找到并加载所指定的模块:

protected override IModuleCatalog GetModuleCatalog()
{
    ModuleCatalog catalog = new ModuleCatalog()
        .AddModule(typeof(HelloWorldModule.HelloWorldModule));
    return catalog;
}

 

*注:这里要添加对一个命名空间的引用,才能使用IModuleCatalog和ModuleCatalog:

using Microsoft.Practices.Composite.Modularity;
这个例子的代码位于QuickStart中的HelloWorld目录中。

补充:

      Prism是基于Silverlight 2.0版本的,但是由于它只是一个框架,所以对于当前的Silverlight 3 beta1版本也是适用的;而Prism中自带的几个Silverlight例子,则需要对sln文件进行转换才能打开,这里,我们只关心框架,而不care版本。

      关于Silverlight的Hello World版本,也位于QuickStart中的HelloWorld目录中。

posted @ 2009-05-30 00:01 Jianqiang Bao Views(5850) Comments(16) Edit 收藏

 回复 引用 查看   
#1楼2009-05-30 00:17 | 李永京      
晕,现在都12点了啊
 回复 引用   
#2楼2009-05-30 01:33 | 牛的逼[未注册用户]
内容可能不错,但不喜欢这样的行文,喜欢深入浅出地讲解。首先要说为啥要prism,其次要说,prism有什么特点,然后将它的特点描述在这个Helloworld上,这样就比较好一点。你说呢?
 回复 引用 查看   
#3楼2009-05-30 09:02 | WCF技术联盟      
加点图片啊,要不看上去没苍白无力啊
 回复 引用 查看   
#4楼2009-05-30 11:26 | Q.Lee.lulu      
这么多DLL啊,Silverlight打包的话估计文件不小吧?
 回复 引用 查看   
#5楼[楼主]2009-05-30 17:58 | 包建强      
@WCF技术联盟
这个例子很简单,不需要图的。接下来的8个例子可能会需要图。

@牛的逼
关于HelloWorld,我会有一个系列来讲解。分为实战——解析——总结篇。这是根据CliningBoy的建议设计的。

 回复 引用   
#6楼2009-05-30 19:41 | 牛的逼 [未注册用户]
CliningBoy的建议是什么?@包建强

 回复 引用 查看   
#7楼2009-05-31 00:03 | 郑明      
Silverlight是下载DLL..

 回复 引用 查看   
#8楼2009-06-01 10:03 | baggiojing      
这个框架我正在用,感觉还是挺清晰的
 回复 引用 查看   
#9楼2009-06-01 10:04 | baggiojing      
· Microsoft.Practices.ObjectBuilder2.dll 这个DLL我并没有用到,不知道你在用的时候是作什么样的作用?
 回复 引用 查看   
#10楼[楼主]2009-06-01 10:15 | 包建强      
我只知道是Enterprise Lib的,具体的内容,去问cliningboy,他比我熟悉这套东西。
 回复 引用 查看   
#11楼2009-06-01 11:45 | Clingingboy      
我很生气,是clingingboy,不是cliningboy....
 回复 引用 查看   
#12楼[楼主]2009-06-01 12:15 | 包建强      
@Clingingboy
以后不会了,我会只写中文的:颗粒宁博爱

 回复 引用   
#13楼2009-08-15 15:39 | chris7788[未注册用户]
这个基本上是针对CAL文档的逐字翻译,大概很多人会看不懂
 回复 引用 查看   
#14楼2009-08-17 11:57 | harry.guo      
有几个问题
1.在下载下来的框架中找不到Microsoft.Practices.Composite.Presentation.dll,Microsoft.Practices.ServiceLocation.dll

不知道有什么用。
2.IRegionViewRegistry regionViewRegistry这个不知道从哪里引用...和\Source\QuickStarts\HelloWorld的例子不一样!

 回复 引用 查看   
#15楼2009-12-15 16:53 | allentranks      
· Microsoft.Practices.Composite.Presentation.dll
这个DLL找不到。。
silverlight版的helloworld示例也没有。。
跟楼主版本不一样??

我的下的是 http://www.microsoft.com/downloads/details.aspx?FamilyID=387c7a59-b217-4318-ad1b-cbc2ea453f40&displaylang=en

Final Release

 回复 引用 查看   
#16楼2010-01-05 12:13 | 迪迪迪      
Quickstarts 里边有个 Hello World 把这个项目加载起来,在找他引用的dll 就能找到Microsoft.Practices.Composite.dll