Silverlight3一个很显著的特点就是其应用可以在浏览器外运行。就是说一个在浏览器中运行的应用可以被独立(detached)出来,并通过一个桌面和开始菜单栏图标来启动执行,而不在需要有网络连接。这样给人的感觉其就像一个普通的桌面应用而不是一个浏览器应用程序。
<
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
="txtStatus" Text ="Not Set" HorizontalAlignment ="Center" Margin ="10" /> Button
Content ="Click Me"
Click ="OnClicked"
Margin ="10" </ StackPanel
UserControl >
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
="txtStatus" Text ="Not Set" HorizontalAlignment ="Center" Margin ="10" /> Button
Content ="Click Me"
Click ="OnClicked"
Margin ="10" </ StackPanel
UserControl >
还有一些代码:
public
partial
class
MainPage : UserControl
{
MainPage()
{
InitializeComponent();
OnExecutionStateChanged( null , );
App.Current.ExecutionStateChanged += OnExecutionStateChanged;
}
void OnExecutionStateChanged( object sender, EventArgs e)
{
txtStatus.Text = App.Current.ExecutionState.ToString();
}
OnClicked( 然后我们在浏览器中运行它并看到一个新的鼠标右击菜单:
{
MainPage()
{
InitializeComponent();
OnExecutionStateChanged( null , );
App.Current.ExecutionStateChanged += OnExecutionStateChanged;
}
void OnExecutionStateChanged( object sender, EventArgs e)
{
txtStatus.Text = App.Current.ExecutionState.ToString();
}
OnClicked( 然后我们在浏览器中运行它并看到一个新的鼠标右击菜单:
其允许将该应用独立出来并安装到本地。并且你会注意到,该菜单项是灰色的。
同样地,我们可以在按钮事件中加入一些代码并尝试分离这个应用。
为了提供元数据,我们要编辑一下 appmanifest.xml 文件:
Deployment
xmlns
="http://schemas.microsoft.com/client/2007/deployment"
xmlns:x ="http://schemas.microsoft.com/winfx/2006/xaml"
Deployment.Parts Deployment.ApplicationIdentity ApplicationIdentity
ShortName ="Mike's Silverlight App"
Title ="Mike's App Window"
ApplicationIdentity.Blurb Mikes Application Blurb ApplicationIdentity.Icons Icon Size ="16x16" icons/16x16.png Icon ="32x32" icons/32x32.png ="48x48" icons/48x48.png ="128x128" icons/128x128.png ApplicationIdentity Deployment >
xmlns:x ="http://schemas.microsoft.com/winfx/2006/xaml"
Deployment.Parts Deployment.ApplicationIdentity ApplicationIdentity
ShortName ="Mike's Silverlight App"
Title ="Mike's App Window"
ApplicationIdentity.Blurb Mikes Application Blurb ApplicationIdentity.Icons Icon Size ="16x16" icons/16x16.png Icon ="32x32" icons/32x32.png ="48x48" icons/48x48.png ="128x128" icons/128x128.png ApplicationIdentity Deployment >
这样当单击鼠标右键后该菜单项将会变成“有效”:
注:那是个标准对话框,而通过使用我本人头像设置的对话框是下面这个样子:
但我不打算这样做,我想还是显示标准对话框会好一些:)
注:第二个应用拷贝现在运行在了窗体中,它与浏览器窗体还是有一些区别的。
现在我在桌面上有了该应用的一个图标:
并且在开始菜单中也有:
如果我从这两个地方运行这个应用时,会看到一个“非浏览器”的应用:
此时当我在浏览器中运行这个原始(版本)的应用时,它显示了相同的“Detached”状态:
好的,现在我修改一下原应用,将背景设置为"red":
然后再次运行并发布这个新的XAP到WEB服务器上。起初,它显示“Detached”,然后它切换到“DetachedUpdatesAvailable".这意味着可以告诉用户该应用已被更新,并提示他们重启该应用:
之后,将他们再运行该应用时,会获取到新的版本(我更新到服务器上的那个版本):
尽管 App.Current.ExecutionState属性返回“Detached”,但这与你在浏览器
或本
地
运行
该应用是无关的。这是需要有另一个标志来决定该应用是从浏览器还是从本地(分离)
启动。
就当前应用实际运行的代码而言,当其离线时(offline),存在一个进程(文件位于:Program Files\Microsoft Silverlight\VERSION\sllauncher.exe).看上去
它就是通过
应用名称
去运行相应程序。使用Reflector去浏览一下,发现其进程好像是非托管的
运行,
因此我不认为能
从中能获取一些内部信息。但其值得一说的是该launcher的roles之一
就
是保持应用的上下文安全。
即:如果应用是从域foo.com获取,那么该应用就必须本地化
运行。
尽管它是从
foo.com上启动(
launched)的。
还有要注意的是这种detached在功能上貌似依赖于Isolated Storage(隔离)存储。
因为我发
现
当把应用“detached”时,必须在打开Isolated Storage,真是如此。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。