Silverlight 3 Beta 新特性解析(4) - 离线功能篇

前提条件:

阅读本文之前请确认你已经安装了如下软件

本篇主要内容:

离线功能实战

离线功能原理

离线功能实战:

在开始这个部分的学习之前,请大家下载一下Silverlight 3 Beta 新特性解析(3) - Media篇的源代码

我们将把这个程序变成离线应用程序,其大概步骤如下:

1.打开SL3Beta.Media工程中Properties目录下的AppManifest.xml文件,其默认状态下是不支持离线功能的

   1: <Deployment xmlns="http://schemas.microsoft.com/client/2007/deployment"
   2:         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
   3: >
   4:     <Deployment.Parts>
   5:     </Deployment.Parts>
   6:  
   7:     <!-- Uncomment the markup and update the fields below to make your application offline enabled
   8:     <Deployment.ApplicationIdentity>
   9:         <ApplicationIdentity 
  10:             ShortName="Out of Browser Silverlight Application" 
  11:             Title="Window Title of Your Silverlight Application">
  12:             <ApplicationIdentity.Blurb>Description of your Silverlight application</ApplicationIdentity.Blurb>
  13:         </ApplicationIdentity>
  14:     </Deployment.ApplicationIdentity>
  15:     -->
  16: </Deployment>

因为部署成离线功能的代码已经被注释起来了

2.修改AppManifest.xml文件如下

   1: <Deployment xmlns="http://schemas.microsoft.com/client/2007/deployment"
   2:         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
   3: >
   4:     <Deployment.Parts>
   5:     </Deployment.Parts>
   6:  
   7:     <Deployment.ApplicationIdentity>
   8:         <ApplicationIdentity 
   9:             ShortName="SL3Beta Test" 
  10:             Title="SL3Beta Test">
  11:             <ApplicationIdentity.Blurb>Description of your Silverlight application</ApplicationIdentity.Blurb>
  12:             <ApplicationIdentity.Icons>
  13:               <Icon Size="16x16">Band16.png</Icon>
  14:               <Icon Size="32x32">Band32.png</Icon>
  15:               <Icon Size="48x48">Band48.png</Icon>
  16:               <Icon Size="128x128">Band128.png</Icon>
  17:             </ApplicationIdentity.Icons>
  18:         </ApplicationIdentity>
  19:     </Deployment.ApplicationIdentity>
  20:     
  21: </Deployment>

12~17行用来设置显示在桌面或者开始菜单里的图标

这些图标需要真的就是所规定的尺寸,否则将不会安装离线程序

(由于我没有符合要求的图标,所以采用了默认图标,也就是注释了12~17行)

3.右键点击鼠标,并选择安装离线程序

SL3Beta_Media06

SL3Beta_Media07

离线程序界面和图标

SL3Beta_Media08

卸载方式也非常简单,直接点击右键选择卸载就可以了

SL3Beta_Media09 

总结一下,离线程序安装在了C:\Users\[用户名]\AppData\LocalLow\Microsoft\Silverlight(这个目录是隐藏的)

而产生离线程序的模式是通过调用Application.Current.Detach()这个方法来是实现的

知道这个了,我们就可以以鼠标点击按钮的形式(而不是右键点击鼠标)来实现离线功能了

修改我们的XAML文件如下:

   1: <StackPanel>
   2:     <MediaElement x:Name="ME" Source="gt_hd.wmv" MouseLeftButtonDown="ME_MouseLeftButtonDown"/>
   3:     <controls:WrapPanel x:Name="ThumbnailsPanel"></controls:WrapPanel>
   4:     <Button Content="离线" x:Name="Detach" HorizontalAlignment="Center" VerticalAlignment="Center" Click="Detach_Click"/>
   5: </StackPanel>

而触发的鼠标点击事件实现如下:

   1: private void Detach_Click(object sender, RoutedEventArgs e)
   2: {
   3:     try
   4:     {
   5:         Application.Current.Detach();
   6:     }
   7:     catch
   8:     {
   9:         MessageBox.Show("不支持离线功能!");
  10:     }
  11: }

由于调用Application.Current.Detach()这个方法不出现异常的前提是AppManifest.xml文件已经设置成支持离线功能了

所以上面做了下异常处理

但是现在还存在一个小小的问题

如果我们已经安装好了离线程序了,那么启动离线程序后再点击离线按钮会不会有问题了,怎么控制?

还好微软也想到了这一点

我们可以通过Application.Current.RunningOffline这个bool属性来获取当前的应用程序是否是离线程序,来决定离线按钮是否可见

   1: if (Application.Current.RunningOffline)
   2: {
   3:     this.Detach.Visibility = Visibility.Collapsed;
   4: }

到这里我们算是大功告成了。

离线功能原理:

这部分内容来源于Tim Heuer的博文Silverlight 3 Out-of-browser Update Model

分离程序

调用Application.Current.Detach()这个方法后,进程将做如下一些事情:

detach

  • 通过浏览器重新获取最新的应用程序(XAP文件)
  • XAP文件将保存在一个低信任度的本地地址,此外还将保存含有XAP文件原始URI地址等详细信息的元数据(metadata)

离线程序的启动:

这是进程会去查找XAP文件的原始URI并比对返回的HTTP数据

如果没有更新,程序将直接启动

如果有了新的更新

它将去重新下载这个XAP包来更新离线程序

这一过程是通过检查Application.Current.ExecutionState的状态是不是已经变成了DetachedUpdatesAvailable状态来完成的

(不过目前更新后,好像XAP包不会重新下载,估计是一个Bug)

launch1

launch2

  1.  

作者:ibillguo
出处:http://ibillguo.cnblogs.com/
本文版权由作者和博客园共同所有,转载请注明出处
posted @ 2009-03-21 13:46  ibillguo  阅读(3036)  评论(4编辑  收藏  举报