Silverlight 中的资源 - 第 1 部分(资源文件)






4.22/5 (9投票s)
Silverlight 中的资源:简要概述
引言
资源对于 Web 应用程序来说一直至关重要,在 Silverlight 应用程序中也是如此,它在创建富 Internet 应用程序方面发挥着重要作用。在此上下文中,资源意味着可以用于创建富应用程序的图像、音频、视频、对象,如样式或数据模板。Silverlight 支持多种存储和管理资源的方式。在这篇文章中,我们将探讨可用的不同选项。
关于资源的完整信息将跨越多篇文章,我们将涵盖二进制资源(资源文件)和 XAML 资源。
管理资源的各种方式
在 Silverlight 中,资源可以通过以下方式进行管理:
- 服务器端资源,按需加载
- 嵌入在 XAP/程序集中的资源
- 来自外部程序集的资源
最重要的一点是,我们不应混淆程序集资源和 XAML 资源,尽管两者都被称为资源。我们可以将资源类型分为两类:
- 除可执行文件或二进制/程序集资源以外的文件(通过资源文件管理)
- 如样式、模板等对象,或 XAML 资源(通过资源字典管理)
基本上,本文的重点是为您简要介绍资源文件、二进制资源或程序集资源。在这篇文章中,我们将探讨这些资源文件如何从 Silverlight 中存储和管理。后续文章将重点介绍资源字典或 XAML 资源。
管理资源文件
在开始介绍资源文件之前,让我们快速回顾一下我们将经常遇到的几个重要术语。
应用程序包 – 打包为 XAP 文件的文件,其中包括 Silverlight 程序集和应用程序清单文件,以及任何资源。
应用程序根目录 – XAP 文件在部署解决方案中的位置,通常是 ClientBin 文件夹。
URI - 代表统一资源标识符,是资源的路径。它可以是:
绝对 URI | 相对 URI |
资源的精确位置,例如,一个限定的 URL (www.manaspatnaik.com/image1.jpg) |
相对于应用程序根目录(应用程序包所在位置)的文件位置。例如:“/image1.jpg” |
当文件位于应用程序根目录之外时使用 | 在应用程序根目录下的域内存储资源的常见场景 |
文件必须位于与包相同的应用程序根目录文件夹内。 |
应用程序根目录是应用程序包 XAP 文件所在的文件夹。因此,所有文件都必须与 XAP 文件位于同一文件夹内。相对 URI 不会查找此文件夹之外的内容,但它支持应用程序根目录内的文件夹结构。因此,我们可以在应用程序根目录下的 Resource 文件夹内放置文件 image1.jpg。
除了 Uri,每个文件还有一个 BuildAction
(Build Action)属性,我们将在下面的示例中逐步探索。
资源文件
众所周知,Silverlight 应用程序不过是一系列压缩并存储为单个文件的集合。添加到 Silverlight 项目内部客户端的任何资源都会根据部署模式传输到客户端。让我们通过以下示例进行检查:
部署模式,BuildAction(Build Action)
这里最需要注意的是资源的部署配置方式。默认情况下,文件的 BuildAction
属性设置为 Resource
。Silverlight 提供了多种选项,有时会派上用场。

通常,资源可以根据以下 BuildAction(Build Action)选项进行部署:
- Content
- Resource
- 无
对于每种选项,应用程序包和 URI 都会有所不同。另外请注意,在 Silverlight 项目中,虽然有多种选项,但只能使用上述BuildAction(Build Action)。
Content
Content 选项会将文件作为松散资源添加到应用程序包中。
在这里,在项目中,将文件 BuildAction(Build Action)更改为 Content 并重新生成解决方案。XAP 文件大小约为 42 KB,其中包含图像。
要定位资源文件,可以遵循上述方法之一。
XAML
<Grid x:Name="LayoutRoot" Background="White">
<Image Margin="12,12,12,77" Name="image1" Stretch="Fill" Source="/BananaTECH.jpg" />
</Grid>
代码
image1.Source = new BitmapImage(new Uri("/BananaTECH.jpg",UriKind.Relative));
Resource
此选项会将资源添加到应用程序包内的 Silverlight 程序集中。
在更改图像的 BuildAction 类型后重新生成项目,XAP 文件大小保持在 43 KB 不变,但图像已嵌入到 MySilverlightApp.dll 中。您可以比较与上述 Content 类型相比的程序集大小差异。
要定位资源,**不应该有任何前导路径**。
XAML
<Grid x:Name="LayoutRoot" Background="White">
<Image Margin="12,12,12,77" Name="image1" Stretch="Fill" Source="BananaTECH.jpg" />
</Grid>
代码
image1.Source = new BitmapImage(new Uri("BananaTECH.jpg", UriKind.Relative));
无
此选项既不将资源添加到应用程序包,也不添加到 Silverlight 程序集。您需要手动将资源添加到服务器。
使用 None BuildAction 时,XAP 文件大小急剧减小,因为资源没有嵌入到包或程序集中。下面的屏幕截图显示了大小为 4 KB 的 XAP 文件。为了使您的已部署代码正常工作,我们需要将资源文件放置在已发布的项目下的 clientbin 文件夹中。
XAML
<Grid x:Name="LayoutRoot" Background="White">
<Image Margin="12,12,12,77" Name="image1" Stretch="Fill"
Source="BananaTECH.jpg" /></Grid>
代码
image1.Source = new BitmapImage(new Uri("BananaTECH.jpg", UriKind.Relative));
来自外部程序集的资源
将资源重构到单独的程序集中以供应用程序之间重用是明智的。外部程序集资源的最佳示例是主题库。Silverlight 也支持在项目中使用的外部 Silverlight 程序集。让我们创建一个 Silverlight 程序集项目。
然后添加对 Silverlight 项目的引用将允许您在应用程序中使用资源文件。
可以使用以下语法来使用资源:
/assemblyName;component/resourceLocation
例如,在此项目中,可以从 MyResources 程序集中使用 URI “/MyResources;component/Rupees.jpg” 来获取图像文件。这里的 component 是关键字。
<Grid x:Name="LayoutRoot" Background="White">
<Image Margin="12,12,12,77" Name="image1" Stretch="Fill"
Source="/MyResources;component/Rupees.jpg" /></Grid>
结论
希望这篇文章能让您对资源文件有一个清晰的认识。资源的主题尚未完成,这里我们只讨论了文件/二进制资源,但还有很多内容需要讨论和分享。在接下来的文章中,我将尝试涵盖更多关于此主题的内容。请发送您的建议和疑问。
历史
- 2011 年 5 月 19 日:初稿