深入解析Silverlight离线应用:安装、状态跟踪与功能特性
立即解锁
发布时间: 2025-08-26 01:28:10 阅读量: 3 订阅数: 11 


Silverlight 4 in VB: 创建跨平台浏览器应用程序
### 深入解析 Silverlight 离线应用:安装、状态跟踪与功能特性
#### 1. 离线应用安装优势与流程
Silverlight 离线应用的安装窗口具有显著优势,它以清晰、无威胁性的表述说明即将发生的操作,无需管理员账户或提升权限,且前后无额外安全警告。相比通过 ClickOnce 安装标准 .NET 应用的提示,Silverlight 离线应用的安装体验更加友好,能降低用户因晦涩警告而放弃安装的可能性。
安装流程方面,应用会被放置在当前用户配置文件中的随机生成文件夹内。安装完成后,新安装的应用会在独立窗口中启动,但原浏览器窗口仍保持打开,这意味着会有两个应用实例同时运行。可通过处理 `InstallStateChanged` 事件来应对此情况。
需注意,离线应用仅为当前账户安装,就像一个用户的网页书签对其他用户不可见一样,一个用户本地安装的 Silverlight 应用(及其相关桌面或开始菜单快捷方式)不会显示给同一台计算机的其他用户。
#### 2. 自定义安装窗口图标
安装窗口的默认图像比警告图标等吓人的图片要好得多,但还可通过替换自定义图片来获得更好效果。Silverlight 允许提供小图像文件来定制以下细节:
- 使用 16×16 的图像作为标题栏和开始菜单中的应用图标。
- 使用 32×32 的图像作为桌面(以及其他大图标视图)中的应用图标。
- 使用 48×48 的图像作为平铺模式下的应用图标。
- 使用 128×128 的图像作为安装窗口的图标。
自定义步骤如下:
1. 将图像添加到项目中,每个图像文件必须是具有正确尺寸的 PNG 文件。为便于组织,可将图像放在项目子文件夹(如 `AppIcons`)中。
2. 在解决方案资源管理器中选择每个图像,将“生成操作”设置为“内容”(而非“资源”),以便图像作为单独文件打包在 XAP 中。
3. 返回“离线设置”窗口,指定要使用的图标。
需注意,图像是安装窗口中唯一可更改的细节,无法更改其提供的选项或使用的描述性文本。
#### 3. 跟踪应用状态
离线应用本质上是普通的 Silverlight 应用,只是应用清单中包含了一些额外信息,这让用户可以选择在本地安装,但不影响其在浏览器中运行。在很多情况下,需要关注应用的执行状态,即它是在浏览器中运行还是在独立窗口中运行。可以使用 `Application.IsRunningOutOfBrowser` 属性来实现此设计,该属性在应用作为独立应用启动时返回 `True`,在浏览器中运行时返回 `False`。
以下是一个示例代码,用于创建仅支持离线使用的应用:
```vb
Private Sub Application_Startup(ByVal o As Object, ByVal e As StartupEventArgs) _
Handles Me.Startup
If Application.Current.IsRunningOutOfBrowser Then
' Show the full user interface.
Me.RootVisual = New MainPage()
Else
' Show a window with an installation message and an Install button.
Me.RootVisual = New InstallPage()
End If
End Sub
```
不过,这段代码存在一个可能的问题。它通过测试 `IsRunningOutOfBrowser` 属性来决定是否启动安装过程。若应用当前在浏览器中运行(即 `IsRunningOutOfBrowser` 为 `True`),应用显然已安装;但反之不一定成立,若应用不在浏览器中运行(即 `IsRunningOutOfBrowser` 为 `False`),它仍可能已安装。要确定应用是否已安装,需检查 `Application.InstallState` 属性,该属性取值来自 `InstallState` 枚举,具体如下表所示:
| 值 | 描述 |
| ---- | ---- |
| NotInstalled | 应用在浏览器中运行,且未作为离线应用安装。 |
| Installing | 应用正在作为离线应用进行安装。 |
| InstallFailed | 离线安装过程失败。 |
| Installed | 应用已作为离线应用安装,但这并不一定意味着它当前正在浏览器外运行,要确定此事实,需检查 `IsRunningOutOfBrowser` 属性。 |
`InstallPage` 类在加载时会考虑这些细节,其构造函数中的代码可确定应用是否已安装:
```vb
Public Sub New
InitializeComponent()
If Application.Current.InstallState = InstallState.Installed Then
lblMessage.Text = "This application is already installed. " & _
"You cannot use the browser to run it. " & _
"Instead, use the shortcut on your computer."
cmdInstall.IsEnabled = False
Else
lblMessage.Text = "You need to install this application to run it."
cmdInstall.IsEnabled = True
End If
End Sub
```
当应用成功安装后,应通知用户。但不能仅因为 `Install()` 方法返回 `True` 就假定应用已成功安装,这仅表示用户在安装窗口中点击了“确定”按钮开始安装,实际安装过程是异步进行的。随着安装的进行,Silverlight 会调整 `Applicaton.InstallState` 属性并触发 `Application.InstallStateChanged` 事件。以下是 `App` 类中的示例代码,用于在应用安装时做出反应并通知 `InstallPage`:
```vb
Private Sub Application_InstallStateChanged(ByVal o As Object, _
ByVal e As EventArgs) Handles Me.InstallStateChanged
Dim page As InstallPage = TryCast(Me.RootVisual, InstallPage)
If page IsNot Nothing Then
' Tell the root visual to show a message by calling a method
' in InstallPage that updates the display.
Select Case Me.InstallState
Case InstallState.InstallFailed
page.DisplayFailed()
Case InstallState.Installed
page.DisplayInstalled()
End Select
End If
End Sub
```
同时,需在 `InstallPage` 类中添加以下方法来显示更新后的状态文本:
```vb
Public Sub DisplayInstalled()
lblMessage.Text = _
"The application installed and launched. You can close this page."
End Sub
Public Sub DisplayFailed()
lblMessage.Text = "The application failed to install."
cmdInstall.IsEnabled = True
End Sub
```
#### 4. 应用的卸载与更新
- **卸载**:卸载过程很简单,用户只需右键单击正在运行的应用(无论是在浏览器中还是独立窗口中),选择“移除该应用”,确认对话框出现后点击“确定”,应用将迅速卸载,其快捷方式也会被移除。所有卸载操作必须由用户发起,因为没有对应的 `Application` 类方法。
- **更新**:Silverlight 具备内置的检查应用更新版本的能力,只需调用 `Application.CheckAndDownloadUpdateAsync()` 方法。该方法会启动一个异步过程,检查 Web 服务器是否有更新的 XAP 文件(以文件日期为准,编译应用时使用的实际版本号无影响)。
以下是一个在应用启动时检查更新的示例代码:
```vb
Private Sub Application_Startup(ByVal o As Object, ByVal e As StartupEventArgs) _
Handles Me.Startup
If Application.Current.IsRunningOutOfBrowser Then
' Check for updates.
Application.Current.CheckAndDownloadUpdateAsync()
Me.RootVisual = New MainPage()
Else
Me.RootVisual = New InstallPage()
End If
End Sub
``
```
0
0
复制全文
相关推荐








