这篇继续介绍Module的功能.
第5篇已经介绍过模块的一些基本功能了,这篇介绍模块在silverlight的特殊应用.
silverlight的项目生成文件是xap文件,其提供了一个非常方便的功能,即相互的xap文件可以相互加载,就如flash的swf文件一样可以动态加载.建议你在看下去之前先看一下TerryLee写的这两篇文章
这里我简单的总结一下silverlight程序初始化的步骤.总目标是要拿到xap里面的UserControl
1.先加载xap文件,xap文件包括一个xaml文件和一堆相关的dll(这里就可以知道dll越多,加载速度越慢了)
2.找到入口点主程序,看Deployment节点的两个属性,一个是程序集,一个是App入口点.然后就可以通过反射初始化了.
<Deployment xmlns="http://schemas.microsoft.com/client/2007/deployment" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" EntryPointAssembly="RemoteModuleLoading.Silverlight" EntryPointType="RemoteModuleLoading.Silverlight.App" RuntimeVersion="2.0.31005.0"> <Deployment.Parts> <AssemblyPart x:Name="RemoteModuleLoading.Silverlight" Source="RemoteModuleLoading.Silverlight.dll" /> <AssemblyPart x:Name="Infrastructure.Silverlight" Source="Infrastructure.Silverlight.dll" /> <AssemblyPart x:Name="Microsoft.Practices.Composite.Silverlight" Source="Microsoft.Practices.Composite.Silverlight.dll" /> <AssemblyPart x:Name="Microsoft.Practices.Composite.UnityExtensions.Silverlight" Source="Microsoft.Practices.Composite.UnityExtensions.Silverlight.dll" /> <AssemblyPart x:Name="Microsoft.Practices.Unity" Source="Microsoft.Practices.Unity.dll" /> <AssemblyPart x:Name="Microsoft.Practices.ServiceLocation.Silverlight" Source="Microsoft.Practices.ServiceLocation.Silverlight.dll" /> <AssemblyPart x:Name="Microsoft.Practices.Composite.Presentation.Silverlight" Source="Microsoft.Practices.Composite.Presentation.Silverlight.dll" /> <AssemblyPart x:Name="System.Windows.Controls" Source="System.Windows.Controls.dll" /> </Deployment.Parts> </Deployment>
那么加载外部的xap文件该如何做呢?
1.先下载好要加载的xap文件
2.然后再读取xap的那个xaml文件
3.反射加载dll文件,拿到我们想要的内容.
我想大致应该是如此,prism对此功能进行了一些封装.让我们来看看prism是如何实现这一功能的.
模块组功能(ModuleInfoGroup)
prism v2添加一个模块组的功能,我们可以来看一下下面的类图关系.
1.ModuleCatalog是一个模块集合,Items是其默认的集合属性,Item的类型是IModuleCatalogItem,该接口是一个空实现,作为一个标识作用,ModuleInfoGroup和ModuleInfo实现了这个接口,这就可以实现同时添加这两个类型到集合里面.
public Collection<IModuleCatalogItem> Items { get { return items; } }
那么ModuleCatalog的ModuleInfo集合便是ModuleInfoGroup和ModuleInfo的并集.
以xaml文件代替app.config配置文件来加载模块
.
xaml文件有个好处,可以加载xaml文件,然后可以将在xaml文件转成你需要的对象.这也是这篇要讲的重点.
我们先来看一下xaml的配置文件
<Modularity:ModuleCatalog xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:sys="clr-namespace:System;assembly=mscorlib" xmlns:Modularity="clr-namespace:Microsoft.Practices.Composite.Modularity;assembly=Microsoft.Practices.Composite.Silverlight"> <Modularity:ModuleInfoGroup Ref="ModuleX.Silverlight.xap" InitializationMode="OnDemand"> <Modularity:ModuleInfo ModuleName="ModuleX" ModuleType="ModuleX.ModuleX, ModuleX.Silverlight, Version=1.0.0.0" /> </Modularity:ModuleInfoGroup> <Modularity:ModuleInfoGroup Ref="ModulesWY.Silverlight.xap" InitializationMode="WhenAvailable"> <Modularity:ModuleInfo ModuleName="ModuleY" ModuleType="ModuleY.ModuleY, ModulesWY.Silverlight, Version=1.0.0.0"> <Modularity:ModuleInfo.DependsOn> <sys:String>ModuleW</sys:String> </Modularity:ModuleInfo.DependsOn> </Modularity:ModuleInfo> <Modularity:ModuleInfo ModuleName="ModuleW" ModuleType="ModuleW.ModuleW, ModulesWY.Silverlight, Version=1.0.0.0"> </Modularity:ModuleInfo> </Modularity:ModuleInfoGroup> <!-- Module info without a group --> <Modularity:ModuleInfo Ref="ModuleZ.Silverlight.xap" ModuleName="ModuleZ" ModuleType="ModuleZ.ModuleZ, ModuleZ.Silverlight, Version=1.0.0.0" /> </Modularity:ModuleCatalog>
定义好配置文件以后重写Bootstrapper的GetModuleCatalog方法,这个Bootstrapper已经提很多遍了,用ModuleCatalog的静态方法CreateFromXaml创建IModuleCatalog对象
protected override IModuleCatalog GetModuleCatalog() { return ModuleCatalog.CreateFromXaml( new Uri("/RemoteModuleLoading.Silverlight;component/ModulesCatalog.xaml", UriKind.Relative)); }
Xap模块加载器
在模块初始化的时候,有一个IModuleTypeLoader的接口,该接口在wpf和silverlight的实现不同.
wpf的实现就直接去加载dll即可.silverlight的实现刚开始上面已经解释过了
下载xap==>扫描xaml文件的ModuleDeployment的Parts的配置,加载dll==>反射加载UserControl
上面步骤我已经重复讲了3遍了.prism的XapModuleTypeLoader类实现了这个接口.
定义ModuleDeployment配置文件
silverlight主程序默认会产生一个AppManifest的页面用于配置dll文件,但自定义的模块类库,没有这个文件.当读取xap以后,我们还需要定义一个配置文件来读取xap的dll文件.这里由于主程序并没有引用外部要加载的xap文件,所以是认不出来有什么dll的,定这个配置文件就是为读取dll而准备的.
在每个模块中,这个配置文件名字必须是叫ModuleManifest.xaml.这个名字是定死的,XapModuleTypeLoader类硬编码会读取这个文件.如下
<Modularity:ModuleDeployment xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:Modularity="clr-namespace:Microsoft.Practices.Composite.Modularity;assembly=Microsoft.Practices.Composite.Silverlight"> <Modularity:ModuleDeployment.Parts> <AssemblyPart Source="ModuleZ.Silverlight.dll" /> </Modularity:ModuleDeployment.Parts> </Modularity:ModuleDeployment>
dll加载完毕以后就会去初始化实现IModule的类了.好了,这篇专门介绍了prism在silverlight应用中,加载xap文件的配置方式.希望对你有帮助.
发表评论
-
wpf开发常见问题(1)
2008-10-22 21:42 1535经过一段时间wpf的学习和实际开发.现在与大家分享 ... -
初始化集合项依赖属性
2008-11-03 13:38 787在wpf自定义属性时,若此属性为集合类型的话,如 ... -
WPF and SL RadioButtonList Tip
2008-11-03 14:03 778在以下情境下.使用数据绑定分离UI与后端Model ... -
wpf datagrid笔记 part 1
2008-12-10 23:35 28571,基本属性 开关基本 ... -
Prism V2之旅(2)
2009-01-07 10:02 1115本篇将介绍Prism中Region的使用. 本篇D ... -
Prism V2之旅(3)
2009-01-07 15:24 812上篇介绍了Region的基本应用,这篇接上篇,继续介绍 ... -
Prism V2之旅(4)
2009-01-07 23:42 907上篇介绍了RegionAdapter的作用及如何如何 ... -
Prism V2之旅(5)
2009-01-13 11:54 1058上篇介绍了WPF的Attach Behavior(附加行 ... -
Prism V2之旅(6)
2009-01-13 15:14 993这篇来讲事件.事件主要用来交互. 监听事件 我订 ... -
XAML Guidelines
2009-01-17 11:31 791http://blogs.msdn.com/jaimer ... -
wpf中xaml的类型转换器与标记扩展
2009-02-02 14:03 2284这篇来讲wpf控件属性的类型转换器 类型转换器 类 ... -
wpf控件设计时支持(3)
2009-02-02 14:12 2741wpf设计时调试 编辑模型 装饰器 1.wpf ... -
wpf控件样式管理示意图
2009-02-04 14:40 1599...
相关推荐
WPF Prism
Graphpad prism 7是Graphpad推出的最新版本,作为知名的医学绘图软件,Graphpad prism 7在原来几基础上作出了更多种类的统计分析,使用更多种类的图,组织你的数据和更大的灵活性,但是prism还是prism,您同样可以...
Graphpad prism7 windows 安装包
GraphPad Prism 7医学绘图软件
prism模板 vs插件
GraphPad Prism 7可以做各种漂亮的论文图,但是教程呢?这就是
1. Install Delphi Prism Xe with key:MAAF-SPD7DK-BLAGAD-FEBN 2. Copy PrismXe.slip to C:\Program Files\Embarcadero\Delphi Prism\License 3. Copy sanctuarylib.dll to C:\Program Files\Embarcadero\Delphi ...
1、Prism各个重要概念实例 2、MVVM架构 3、WPF中使用Prism
Prism经典案例
Prism系列之模块化
1. Unzip app from Prism 7.0a [k].zip. 2. Launch, enter serial number: GPS-1234567-GZZZ-2D71F ...Enter this Activation code: ACTGP-8EFD3AD7-FB6967B6-95B1249F-57B35DDB Finish activation. If program boun
C#+WPF+Prism模块化开发示例。本示例简述了Prism框架的基本应用,包括数据绑定,事件等内容
WPF Prism 依赖注入实现可关闭的TabControl。
MVVM PRISM DEMOMVVM PRISM DEMOMVVM PRISM DEMOMVVM PRISM DEMOMVVM PRISM DEMOMVVM PRISM DEMOMVVM PRISM DEMOMVVM PRISM DEMO
prism quickstart
VS2022的在线插件库中未收录PrismTemplate插件,导致无法直接在VS中安装Prism模板插件。 该插件基于官网插件修改安装支持版本后,可直接安装使用(电脑只有VS2022)。 如果电脑有多版本VS,需要右键在打开方式中选择...
Prism中文文档,完美的prism简介
prism对话服务
Demo.Prism40。
GaphPad Prism是科研绘图软件,科研论文必备数据分析软件,其功能强大,操作简便。可以胜任大部分医学科研图形的绘制