在Silverlight中访问外部xap文件中UserControl_第1页
在Silverlight中访问外部xap文件中UserControl_第2页
在Silverlight中访问外部xap文件中UserControl_第3页
在Silverlight中访问外部xap文件中UserControl_第4页
在Silverlight中访问外部xap文件中UserControl_第5页
已阅读5页,还剩2页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、在Silverlight中访问外部xap文件中UserControl概述众所周知,在Silverlight 2开始每个项目编译后都会打包成为一个xap文件,如果我们要访问当前xap文件中的UserControl比较容易,那我们如何访问一个外部xap文件中的内容呢?甚至于如何访问一个互联网上的xap文件呢?本文将简单介绍一下在Silverlight中如何访问外部xap文件。需求现在我们先来看一下需求,大致是这样子的,在服务端我们有两个xap文件,其中MainProject.xap文件将会在MainProjectTestPage.aspx中引用,而ExternalProject.xap文件中的Us

2、erControl将会在MainProject.xap文件中访问,并进行显示,如下图所示:现在我们来建立相关的项目,最终完成的项目结构如下图所示:这样在编译后,将会在ClientBin文件夹下产生两个.xap文件,现在我们将在MainProject.xap文件中访问ExternalProject.xap中的UserControl。分析在实现这个过程中,我们将会遇到两个问题:1.因为没有任何页面引用ExternalProject.xap文件,所以它不会下载到客户端,这一点我们可以通过编码的方式来下载它。2.访问ExternalProject.xap中的UserControl,我们需要找到对应的程

3、序集,以便使用反射,我们知道在xap文件是一个标准的zip文件,它会包含相关的程序集(接下来我会写一篇文章专门解释xap文件),如下图所示:现在解决了xap文件的下载已经程序集的访问问题,我们可以着手来实现了。实现实现的过程也是相当简单,首先我们使用WebClient去下载xap文件,相信大家都知道该怎么做了,如下代码所示void myButton_Click(object sender, RoutedEventArgs e) Uri address = new Uri("http:/localhost:

4、4161/ClientBin/ExternalProject.xap"); WebClient webClient = new WebClient(); webClient.OpenReadCompleted += new OpenReadCompletedEventHandler(webClient_OpenReadCompleted); webClient.OpenReadAsync(address); void webClient_OpenReadCompleted(object send

5、er, OpenReadCompletedEventArgs e) / 得到下载结果 这一步比较简单,接下来我们将根据下载的结果,得到相应的程序集。我们知道在xap文件中的AppManifest.xaml文件相当于一个清单,列出了当前xap文件用到的程序集,它的内容如下所示:<Deployment xmlns="             xmlns:x="     

6、60;       EntryPointAssembly="ExternalProject"              EntryPointType="ExternalProject.App"              Runti

7、meVersion="2.0.30523.6">   <Deployment.Parts>     <AssemblyPart x:Name="ExternalProject" Source="ExternalProject.dll" />   </Deployment.Parts> </Deployment>注意,在Deployment.Parts节点下包含了当前应用程序

8、中所有的程序集。首先要根据下载的结果获取AppManifest.xaml文件中的内容,如下代码所示:Stream stream = Application.GetResourceStream(         new StreamResourceInfo(packageStream, null),         new Uri("AppManifest.xaml&q

9、uot;, UriKind.Relative).Stream; String appManifestString = new StreamReader(stream).ReadToEnd();有了AppManifest.xaml中内容,就可以根据它来构造一个Deployment对象,Deployment对象提供了当前应用程序的Part和本地化信息清单,它的定义如下所示:注意它定义了一个很重要的属性Parts,通过该属性我们就可以访问所有Deployment中的程序集。好了,现在我们看如何通过AppManifest.xaml中的内容构造Deplo

10、yment对象,以及遍历其中的程序集,如下代码所示:Deployment deployment = (Deployment)XamlReader.Load(appManifestString); Assembly assembly = null; foreach (AssemblyPart assemblyPart in deployment.Parts)     if (assemblyPart.Source = assem

11、blyName)              String source = assemblyPart.Source;         StreamResourceInfo streamInfo = Application.GetResourceStream(       

12、0;     new StreamResourceInfo(packageStream,             "application/binary"),             new Uri(source,UriKind.Relative);  

13、60;      assembly = assemblyPart.Load(streamInfo.Stream);         break;      return assembly;注意,在遍历时如果我们找到程序集名等于我们想要访问的程序集,则直接返回该程序集。最终完整的LoadAssemblyFromXap方法代码如下:Assembly LoadAssemblyFrom

14、Xap(Stream packageStream,String assemblyName)     Stream stream = Application.GetResourceStream(             new StreamResourceInfo(packageStream, null),      &

15、#160;      new Uri("AppManifest.xaml", UriKind.Relative).Stream;     String appManifestString = new StreamReader(stream).ReadToEnd();     Deployment deployment = (Deployment)X

16、amlReader.Load(appManifestString);     Assembly assembly = null;     foreach (AssemblyPart assemblyPart in deployment.Parts)              if (assemblyPart.Sourc

17、e = assemblyName)                      String source = assemblyPart.Source;             StreamResourceInfo str

18、eamInfo = Application.GetResourceStream(                 new StreamResourceInfo(packageStream,                 "applicat

19、ion/binary"),                 new Uri(source,UriKind.Relative);             assembly = assemblyPart.Load(streamInfo.Stream);   

20、60;         break;                   return assembly; 得到程序集后,再使用反射创建相关的实例,并在页面上加载,如下代码所示:Assembly assembly = LoadAssemblyFromXap(e.Result, "Exter

21、nalProject.dll"); UIElement element = assembly.CreateInstance("ExternalProject.SubPage") as UIElement; this.holder.Children.Add(element);运行后效果如下图所示:跨域访问在上面的示例中,不涉及到跨域调用的问题,如果大家想访问的xap文件与当前xap文件不在同一站点中,需要添加跨域访问文件,如下代码所示:<?xml version="1.0" encoding="utf-8"?> <access-pol

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论