silverlight   发布时间:2022-05-04  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了在Silverlight中如何访问外部xap文件中UserControl大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

概述

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

  本文将简单介绍一下在Silverlight中如何访问外部xap文件

  需求

  现在我们先来看一下需求,大致是这样子的,在服务端我们有两个xap文件,其中MainProject.xap文件将会在MainProjectTestPage.aspx中引用,而ExternalProject.xap文件中的UserControl将会在MainProject.xap文件中访问,并进行显示,如下图所示:

在Silverlight中如何访问外部xap文件中UserControl


  现在我们来建立相关的项目,最终完成的项目结构如下图所示:

在Silverlight中如何访问外部xap文件中UserControl


  这样在编译后,将会在ClientBin文件夹下产生两个.xap文件,现在我们将在MainProject.xap文件中访问ExternalProject.xap中的UserControl。

  分析

  在实现这个过程中,我们将会遇到两个问题:

  1.因为没有任何页面引用ExternalProject.xap文件所以它不会下载到客户端,这一点我们可以通过编码的方式来下载它。

  2.访问ExternalProject.xap中的UserControl,我们需要找到对应的程序集,以便使用反射,我们知道在xap文件一个标准的zip文件,它会包含相关的程序集(接下来我会写一篇文章专门解释xap文件),如下图所示:

在Silverlight中如何访问外部xap文件中UserControl


  现在解决了xap文件的下载已经程序集的访问问题,我们可以着手来实现了。

  实现

  实现的过程也是相当简单,首先我们使用WebClient去下载xap文件,相信大家都知道该怎么做了,如下代码所示

void myButton_Click(object sender, routedEventArgs E)
{
     Uri address = new Uri( "http://localhost:4161/ClientBin/ExternalProject.xap");
     WebClient webClient = new WebClient();
     webClient.openReadCoR_571_11845@pleted += 
new OpenReadCoR_571_11845@pletedEventHandler(webClient_OpenReadCoR_571_11845@pleted);
     webClient.openReadAsync(address);
}

void webClient_OpenReadCoR_571_11845@pleted(object sender, OpenReadCoR_571_11845@pletedEventArgs E)
{
     // 得到下载结果
}

  这一步比较简单,接下来我们将根据下载的结果,得到相应的程序集。我们知道在xap文件中的AppManifest.xaml文件相当于一个清单,列出了当前xap文件用到的程序集(下篇文章将会介绍),它的内容如下所示:

<Deployment xmlns="http://scheR_571_11845@as.microsoft.com/client/2007/deployment"
             xmlns:x="http://scheR_571_11845@as.microsoft.com/winfx/2006/xaml" 
             EntryPointAssembly= "ExternalProject" 
             EntryPointType= "ExternalProject.App" 
             RuntimeVersion= "2.0.30523.6">
   <Deployment.Parts>
     <AssemblyPart x:Name="ExternalProject" source="ExternalProject.dll" />
   </Deployment.Parts>
</Deployment>

  注意,在Deployment.Parts节点下包含了当前应用程序中所有的程序集。首先要根据下载的结果获取AppManifest.xaml文件中的内容,如下代码所示:

Stream stream = Application.GetresourceStream(
         new StreamresourceInfo(packageStream, null),
         new Uri( "AppManifest.xaml", UriKind.RelativE)).Stream;

String appManifestString = new StreamReader(stream).ReadToEnd();

  有了AppManifest.xaml中内容,就可以根据它来构造一个Deployment对象,Deployment对象提供了当前应用程序的Part和本地化信息清单,它的定义如下所示:

在Silverlight中如何访问外部xap文件中UserControl


  注意它定义了一个很重要的属性Parts,通过该属性我们就可以访问所有Deployment中的程序集。好了,现在我们看如何通过AppManifest.xaml中的内容构造Deployment对象,以及遍历其中的程序集,如下代码所示:

Deployment deployment = (Deployment)XamlReader.Load(appManifestString);

Assembly assembly = null;
foreach (AssemblyPart assemblyPart in deployment.Parts)
{
     if (assemblyPart.source == assemblyName)
     {
         String source = assemblyPart.source;

         StreamresourceInfo streamInfo = Application.GetresourceStream(
             new StreamresourceInfo(packageStream,
             "application/binary"),
             new Uri(source,UriKind.RelativE));

         assembly = assemblyPart.Load(streamInfo.Stream);
         break;
     }
}
return assembly;

  注意,在遍历时如果我们找到程序集名等于我们想要访问的程序集,则直接返回该程序集。最终完整的LoadAssemblyFromXap方法代码如下:

Assembly LoadAssemblyFromXap(Stream packageStream,String assemblyName)
{
     Stream stream = Application.GetresourceStream(
             new StreamresourceInfo(packageStream,
             new Uri( "AppManifest.xaml", UriKind.RelativE)).Stream;

     String appManifestString = new StreamReader(stream).ReadToEnd();

     Deployment deployment = (Deployment)XamlReader.Load(appManifestString);

     Assembly assembly = null;
     foreach (AssemblyPart assemblyPart in deployment.Parts)
     {
         if (assemblyPart.source == assemblyName)
         {
             String source = assemblyPart.source;

             StreamresourceInfo streamInfo = Application.GetresourceStream(
                 new StreamresourceInfo(packageStream,
                 "application/binary"),
                 new Uri(source,UriKind.RelativE));

             assembly = assemblyPart.Load(streamInfo.Stream);
             break;
         }
     }
     return assembly;
}

  得到程序集后,再使用反射创建相关的实例,并在页面上加载,如下代码所示:

Assembly assembly = LoadAssemblyFromXap(e.Result, "ExternalProject.dll");

UIElement element = assembly.CreateInstance("ExternalProject.SubPage") as UIElement;
this.holder.Children.Add(element);

  运行后效果如下图所示:

在Silverlight中如何访问外部xap文件中UserControl


  跨域访问

  在上面的示例中,不涉及到跨域(我会专门写一篇文章介绍)调用的问题,如果大家想访问的xap文件与当前xap文件不在同一站点中,需要添加跨域访问文件,如下代码所示:

  clientaccesspolicy.xml:

<<?xml version="1.0" encoding="utf-8"?>
<access-policy>
   <cross-domain-access>
     <policy>
       <allow-from http-request-headers="*" />
       <domain uri="*"/>
       </allow-from>
       <grant-to>
         <resource path="/" include-subpaths="true"/>
       </grant-to>
     </policy>
   </cross-domain-access>
</access-policy>

  总结

  本文介绍了在Silverlight中如何访问外部xap文件这一技巧,希望对大家有所帮助。

上一页@H_616_216@   1    下一页@H_616_216@   1/1@H_616_216@

大佬总结

以上是大佬教程为你收集整理的在Silverlight中如何访问外部xap文件中UserControl全部内容,希望文章能够帮你解决在Silverlight中如何访问外部xap文件中UserControl所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
猜你在找的silverlight相关文章