当前位置: 首页 > news >正文

快速浏览Silverlight3:在浏览器外运行Silverlight应用

  Silverlight3一个很显著的特点就是其应用可以在浏览器外运行。就是说一个在浏览器中运行的应用可以被独立(detached)出来,并通过一个桌面和开始菜单栏图标来启动执行,而不在需要有网络连接。这样给人的感觉其就像一个普通的桌面应用而不是一个浏览器应用程序。 

    为了实现独立(detached),用户必须对这类应用有个明确的选择:“该应用在没有用户通知的情况下是不可以detached它自己的。下面用一个例子“Hello World”来展示一下:

< UserControl  x:Class ="SilverlightApplication1.MainPage"
    xmlns
="http://schemas.microsoft.com/winfx/2006/xaml/presentation%22
    xmlns:x="
[url]http://schemas.microsoft.com/winfx/2006/xaml%22[/url]
    Width
="400"  Height ="300" >
    
< StackPanel  x:Name ="LayoutRoot"  Background ="White" >
        
< TextBlock
            
x:Name ="txtStatus"  Text ="Not Set"  HorizontalAlignment ="Center"  Margin ="10"   />
        
< Button
            
Content ="Click Me"
            Click
="OnClicked"
            Margin
="10" />
    
</ StackPanel >
</ UserControl >
 

     还有一些代码:
public   partial   class  MainPage : UserControl
{
    
public  MainPage()
    {
      InitializeComponent();
      OnExecutionStateChanged(
null null );
      App.Current.ExecutionStateChanged 
+=  OnExecutionStateChanged;
    }
    
void  OnExecutionStateChanged( object  sender, EventArgs e)
    {
      txtStatus.Text 
=  App.Current.ExecutionState.ToString();
    }
    
void  OnClicked( object  sender, RoutedEventArgs args)
    {
      App.Current.Detach();
    }
}

    然后我们在浏览器中运行它并看到一个新的鼠标右击菜单:
     [url]http://mtaulty.com/blog/images/Silverlight3RunningOutsidetheBrowser_8418/image_thumb.png[/url]
    其允许将该应用独立出来并安装到本地。并且你会注意到,该菜单项是灰色的。
    同样地,我们可以在按钮事件中加入一些代码并尝试分离这个应用。

void  OnClicked( object  sender, RoutedEventArgs args)
{
      App.Current.Detach();
}
  
    但它并没有启作用,因为右键菜单依旧是灰的.原因在于这个应用没有相应的元数据支持。
    为了提供元数据,我们要编辑一下 appmanifest.xml 文件:

< Deployment  xmlns ="http://schemas.microsoft.com/client/2007/deployment"
            xmlns:x
="http://schemas.microsoft.com/winfx/2006/xaml" >
  
< Deployment.Parts >
  
</ Deployment.Parts >
  
< Deployment.ApplicationIdentity >
    
< ApplicationIdentity
      
ShortName ="Mike's Silverlight App"
      Title
="Mike's App Window" >
      
< ApplicationIdentity.Blurb > Mikes Application Blurb </ ApplicationIdentity.Blurb >
      
< ApplicationIdentity.Icons >
        
< Icon  Size ="16x16" > icons/16x16.png </ Icon >
        
< Icon  Size ="32x32" > icons/32x32.png </ Icon >
        
< Icon  Size ="48x48" > icons/48x48.png </ Icon >
        
< Icon  Size ="128x128" > icons/128x128.png </ Icon >
      
</ ApplicationIdentity.Icons >
    
</ ApplicationIdentity >
  
</ Deployment.ApplicationIdentity >
</ Deployment >

    注:上面这些图标文件必须在VS中以内容"Content"的文件嵌入到XAP文件中。
但我并不确保你也需要这里所有的文件,特别是这个"128x128"(文件);
    这样当单击鼠标右键后该菜单项将会变成“有效”:


    接着,我们前面创建的这个按钮将会触发一个对话框,提供给我们两个选项:
“将这个要运行在浏览器外的应用安装到桌面或开始菜单中”。



    注:那是个标准对话框,而通过使用我本人头像设置的对话框是下面这个样子:



    但我不打算这样做,我想还是显示标准对话框会好一些:)
    如果点击该对话框后,该应用会尝试 detach 它自身。对我而言,它所做的工作就是确保本地XAP文件的有效性。而不是去尝试把其它与它相关联的资源也获取到本地。


    注:第二个应用拷贝现在运行在了窗体中,它与浏览器窗体还是有一些区别的。
    现在我在桌面上有了该应用的一个图标:



    并且在开始菜单中也有:



    如果我从这两个地方运行这个应用时,会看到一个“非浏览器”的应用:



    此时当我在浏览器中运行这个原始(版本)的应用时,它显示了相同的“Detached”状态:



    好的,现在我修改一下原应用,将背景设置为"red":



   
    然后再次运行并发布这个新的XAP到WEB服务器上。起初,它显示“Detached”,然后它切换到“DetachedUpdatesAvailable".这意味着可以告诉用户该应用已被更新,并提示他们重启该应用:

    


     之后,将他们再运行该应用时,会获取到新的版本(我更新到服务器上的那个版本):


 
     如果想删除该应用,可以在本地的“detached”拷贝或浏览器中右击菜单:


     如果我点击上面菜单后,就会将开始菜单和桌面图标移除,这样在浏览器中该应用的状态就从“Detached”变成了“RunningOnline”.

 
     尽管 App.Current.ExecutionState属性返回“Detached”,但这与你在浏览器 或本 运行 该应用是无关的。这是需要有另一个标志来决定该应用是从浏览器还是从本地(分离) 启动。

     在Application中有一个标志即“RunningOffline”,看上去它会返回true/false  状态。 True 意味着当前应用是从本地独立启动的,而False则是在浏览器中启动的。
     就当前应用实际运行的代码而言,当其离线时(offline),存在一个进程(文件位于:Program Files\Microsoft Silverlight\VERSION\sllauncher.exe).看上去 它就是通过 应用名称 去运行相应程序。使用Reflector去浏览一下,发现其进程好像是非托管的 运行, 因此我不认为能 从中能获取一些内部信息。但其值得一说的是该launcher的roles之一 是保持应用的上下文安全。 即:如果应用是从域foo.com获取,那么该应用就必须本地化 运行。 尽管它是从 foo.com上启动( launched)的。
     还有要注意的是这种detached在功能上貌似依赖于Isolated Storage(隔离)存储。 因为我发 当把应用“detached”时,必须在打开Isolated Storage,真是如此。   
    

本文转自 daizhenjun 51CTO博客,原文链接:http://blog.51cto.com/daizhj/142599,如需转载请自行联系原作者

相关文章:

  • 使用 Python Flask 实现 RESTful Web API
  • 如何保护你的linux操作系统
  • rpm db 损坏
  • Microsoft Visual Studio 2010 Ultimate 正式版注册码
  • JavaScript学习笔记(六)——Map、Set与iterable
  • 路由器的无线桥接(TP-Link)
  • c++ static 关键字
  • 小记如何修改xen模块
  • 烂泥:Win8如何禁用IE增强功能
  • Keepalived 配置电信/联通双线高可用集群
  • NeHe OpenGL第十课:3D世界
  • Lync 小技巧-17-查询Lync 2013聊天记录
  • RTX 无法刷新组织架构的处理方法总结
  • java18 任务调度
  • redis允许远程访问
  • [笔记] php常见简单功能及函数
  • 【翻译】Mashape是如何管理15000个API和微服务的(三)
  • 【前端学习】-粗谈选择器
  • 0x05 Python数据分析,Anaconda八斩刀
  • EOS是什么
  • Eureka 2.0 开源流产,真的对你影响很大吗?
  • HTTP--网络协议分层,http历史(二)
  • If…else
  • Laravel Mix运行时关于es2015报错解决方案
  • node入门
  • npx命令介绍
  • rabbitmq延迟消息示例
  • 阿里云爬虫风险管理产品商业化,为云端流量保驾护航
  • 反思总结然后整装待发
  • 服务器从安装到部署全过程(二)
  • 关于Flux,Vuex,Redux的思考
  • 如何设计一个微型分布式架构?
  • 数据库写操作弃用“SELECT ... FOR UPDATE”解决方案
  • 线上 python http server profile 实践
  • 译有关态射的一切
  • 选择阿里云数据库HBase版十大理由
  • ​用户画像从0到100的构建思路
  • (04)Hive的相关概念——order by 、sort by、distribute by 、cluster by
  • (1)STL算法之遍历容器
  • (1)虚拟机的安装与使用,linux系统安装
  • (笔试题)合法字符串
  • (超简单)构建高可用网络应用:使用Nginx进行负载均衡与健康检查
  • (附源码)ssm跨平台教学系统 毕业设计 280843
  • (四)搭建容器云管理平台笔记—安装ETCD(不使用证书)
  • (原創) 博客園正式支援VHDL語法著色功能 (SOC) (VHDL)
  • (转)3D模板阴影原理
  • (转)大道至简,职场上做人做事做管理
  • (转载)VS2010/MFC编程入门之三十四(菜单:VS2010菜单资源详解)
  • .bat批处理(二):%0 %1——给批处理脚本传递参数
  • .net core 6 使用注解自动注入实例,无需构造注入 autowrite4net
  • .Net FrameWork总结
  • .NET Micro Framework初体验
  • .net php 通信,flash与asp/php/asp.net通信的方法
  • .Net 代码性能 - (1)
  • .NET/C# 编译期能确定的字符串会在字符串暂存池中不会被 GC 垃圾回收掉