Silverlight应用程序资源管理与下载指南
立即解锁
发布时间: 2025-08-26 01:40:46 阅读量: 17 订阅数: 26 AIGC 

# Silverlight应用程序资源管理与下载指南
## 1. 应用程序模型与资源下载概述
在Silverlight应用程序的设计中,一种有效的方式是让应用程序在启动时快速下载必要的资源和程序集。下载完成后,应用程序可以展示精美的预加载界面,然后开始进行实际的工作,即通过编程方式下载其正常运行所需的资源和程序集。这种设计方式虽然需要更多的工作,但能带来更好的用户体验。
### 1.1 二进制资源
Silverlight应用程序实际上是一个使用ZIP压缩的文件包,以 `.xap` 为扩展名存储为单个文件。在简单的应用程序中,XAP文件通常只包含一个清单(列出项目使用的文件)和应用程序程序集。不过,你还可以在XAP文件中放置其他内容,即资源。
XAP资源是你希望提供给已编译应用程序使用的独立文件,常见的例子包括图形资产,如你希望在用户界面中显示的图像、声音和视频文件。
由于Silverlight为存储资源提供了多种不同的选项,使用资源可能会变得不必要地复杂。以下是几种常见的选项:
- **应用程序程序集中**:资源文件嵌入到项目的编译DLL文件中,例如 `SilverlightApplication1.dll`,这是默认的方法。
- **应用程序包中**:资源文件与应用程序程序集一起放置在XAP文件中。部署同样简单,但现在更易于管理,因为你可以通过编辑XAP文件来替换或修改资产,而无需重新编译应用程序。
- **源站点上**:资源文件与XAP文件一起放置在网站上。这样会带来更多的部署麻烦,因为你需要确保同时部署XAP文件和资源文件。然而,你可以以其他方式使用这些资源,例如在普通HTML网页中使用图像,或者让视频易于下载。你还可以减少初始XAP下载的大小,这在资源较大时尤为重要。
下面是这些资源存储方式的对比表格:
| 存储方式 | 优点 | 缺点 |
| ---- | ---- | ---- |
| 应用程序程序集 | 默认方式,易于使用 | 用户仍可通过解压缩和反编译获取资源 |
| 应用程序包 | 易于部署和管理,无需重新编译应用程序 | |
| 源站点 | 可灵活使用资源,减少初始XAP下载大小 | 部署麻烦,可能导致下载时间变长 |
### 1.2 资源存储方式流程图
```mermaid
graph LR
A[资源存储方式] --> B[应用程序程序集]
A --> C[应用程序包]
A --> D[源站点]
```
## 2. 将资源放置在应用程序程序集中
这是标准的方法,与其他类型的.NET应用程序(如WPF应用程序)使用的方法类似。
### 2.1 操作步骤
如果你想在Silverlight的 `Image` 元素中显示图像,可按以下步骤操作:
1. 首先,将图像文件添加到项目中。默认情况下,Visual Studio会为图像文件设置 `Resource` 生成操作。
2. 若要更改现有文件的生成操作,可在“解决方案资源管理器”中选择该文件,然后在“属性”窗格的“生成操作”框中进行新的选择。
### 2.2 注意事项
不要将 `Resource` 生成操作与 `Embedded Resource` 混淆。虽然两者都将资源作为二进制数据块嵌入到程序集中,但Silverlight不支持 `Embedded Resource` 方法,并且你无法使用URI引用以这种方式存储的文件。
### 2.3 使用嵌入式资源
由于Silverlight使用URI的方式,使用嵌入式资源非常简单。如果你在 `Image`(用于图形)或 `MediaElement`(用于声音和视频文件)中使用相对URI,Silverlight会检查程序集中是否有名称匹配的资源。例如:
```xml
<Image Source="grandpiano.jpg"></Image>
```
### 2.4 使用子文件夹
你可以在项目中使用文件夹来对资源文件进行分组,这会改变资源的命名方式。例如,将 `grandpiano.jpg` 文件放在名为 `Images` 的子文件夹中,此时需要使用以下URI:
```xml
<Image Source="Images/grandpiano.jpg"></Image>
```
### 2.5 以编程方式检索资源
当你有支持Silverlight URI标准的元素(如 `Image` 或 `MediaElement`)时,使用资源很容易。但在某些情况下,你需要在代码中操作资源,然后再将其传递给元素,或者根本不想使用元素。例如,你可能有一些存储为资源的文本或二进制文件中的静态数据,你希望在代码中检索该文件并处理其数据。
要执行此任务,需要使用 `Application.GetResourceStream()` 方法。该方法允许你通过提供正确的URI来检索特定资源的数据。需要使用以下URI格式:
```plaintext
AssemblyName;component/ResourceFileName
```
例如,如果你在名为 `SilverlightApplication1` 的项目中有一个名为 `ProductList.bin` 的资源,可以使用以下代码:
```csharp
StreamResourceInfo sri = Application.GetResourceStream(
new Uri("SilverlightApplication1;component/ProductList.bin", UriKind.Relative));
```
`GetResourceStream()` 方法不会直接返回流,而是返回一个 `System.Windows.Resources.StreamResourceInfo` 对象,该对象包含一个 `Stream` 属性(包含底层流)和一个 `ContentType` 属性(包含MIME类型)。以下是为流创建 `BinaryReader` 对象的代码:
```csharp
BinaryReader reader = new BinaryReader(sri.Stream);
```
你现在可以使用二进制读取器的方法从文件中提取每一段数据。对于基于文本的数据,可以使用 `StreamReader`;对于XML数据,可以使用 `XmlReader`。当涉及XML数据时,有一个稍微简单的选项,因为 `XmlReader.Create()` 方法可以接受流或指向资源的URI字符串。例如,如果你有一个名为 `ProductList.xml` 的资源,可以使用以下代码:
```csharp
StreamResourceInfo sri = Application.GetResourceStream(
new Uri("SilverlightApplication1;component/ProductList.xml", UriKind.Relative));
XmlReader reader = XmlReader.Create(sri.Stream, new XmlReaderSettings());
```
或者使用更简洁的方法:
```csharp
XmlReader reader = XmlReader.Create("ProductList.xml")
```
## 3. 将资源放置在应用程序包中
这是资源存储的第二种选择,即将资源与应用程序程序集一起放置在XAP文件中。
### 3.1 操作步骤
要实现这一点,需要将相应的文件添加到项目中,并将生成操作更改为 `Content`。最好的是,你可以使用几乎相同的URL,只需在前面加上一个正斜杠,例如:
```xml
<Image Source="/grandpiano.jpg"></Image>
```
如果资源位于XAP文件的子文件夹中,例如:
```xml
<Image Source="/Images/grandpiano.jpg"></Image>
```
这里的前导斜杠表示XAP文件的根目录。如果你在XAP文件的扩展名后添加 `.zip`,就可以打开它并验证资源文件是否存储在其中。
### 3.2 优缺点
将资源放置在XAP文件中与将其嵌入程序集一样易于部署,但增加了一些灵活性。如果你愿意多做一些工作,可以在不重新编译应用程序的情况下操作XAP文件中的文件(例如更新图形)。此外,如果同一个XAP文件中有多个类库程序集,它们都可以使用XAP中的相同资源文件。
### 3.3 资源放置在应用程序包中的操作流程图
```mermaid
graph LR
A[添加资源文件到项目] --> B[更改生成操作到Content]
B --> C[使用带前导斜杠的URL引用资源]
```
## 4. 将资源放置在Web上
这是第三种选择,即从应用程序中移除资源文件,但使其在Web上可用,这样应用程序可以在需要时下载它们。
### 4.1 操作步骤
在Web上部署
0
0
复制全文
相关推荐









