关于Silverlight资源文件(如:图片)的放置位置及其引用
Silverlight中有许多资源文件,例如:图片,音频、视频,甚至XML和XAML等非执行数据文件,在Silverlight中根据资源所处位置的不同而有所区别。
资源文件可分布在我们Silverlight项目的多个位置,在此我们将讨论以下三种情况及其相互间的关系。
1、镶嵌入程序集内
2、在.xap压缩包内而不镶嵌入任何程序集内
3、一个程序集引用另一个程序集内的资源
在操作本文实例前请先准备两个图片,分别是A.jpg和B.jpg,下面我们进入具体实验。
一、建立实验环境
首先,启动VS2008,新建项目,Silverlight应用程序,项目名命名为ResourceLocation,点击确定,VS2008将自动为我们建好了两个项目,一个名为ResourceLocation,一个名为ResourceLocation.Web。在解决方案下添加另一个项目,项目类型为Silverlight类库,项目名为ResourceAssembly,在此项目下,删除系统为我们自动建立的文件Class1.cs,因为我们用不着它。至此,我们在此解决方案下有三个项目,分别名为:
ResourceLocation,
ResourceLocation.Web,
ResourceAssembly
然后,编程项目ResourceLocation的Page.xaml文件,最终代码如下:
二、实验过程
1、实验一
选择ResourceLocation项目,点击鼠标右键,跳出菜单,选择添加--现有项,引入我们准备好的图片A.jpg,把它重命名为p.jpg.
修改ResourceLocation的Page.xaml文件,主要是Image控件的Source属性,改为:
<Image Height="300" Width="400" Source="p.jpg"></Image>
按F5,运行,我们可以看到图片A.jpg的内容。
回到编辑环境,在项目ResourceLocation.Web的ClientBin目录下,添加--现有项,引入我们准备好的图片B.jpg,把它也重命名为p.jpg.然后修改ResourceLocation的Page.xaml文件
<Image Height="300" Width="400" Source="/p.jpg"></Image>
按F5,运行,我们看到的仍然是图片A.jpg的内容。
接下来,我们删除掉ResourceLocation项目中的p.jpg文件
按F5,运行,这下,我们看到的图片内容变成了B.jpg图片的内容。
实验说明:
(1)、由上可知,当资源的分布为
ResourceLocation--p.jpg
ResourceLocation.Web--ClientBin-p.jpg
两个位置时,ResourceLocation--p.jpg资源先被定位,如果此处找不到,再到ResourceLocation.Web--ClientBin-p.jpg处寻找,如果此处也找不找,则会报错。
(2)、Source引用资源的区别
图片放在ResourceLocation中时,引用写法: Source="p.jpg"
图片放在ResourceLocation.Web--ClientBin中时,引用写法: Source="/p.jpg"
反斜杠开头的相对路径,代表的相对位置是应用程序运行的根目录,即ResourceLocation.xap压缩包内,若在这其中寻找不到要引用的文件,则相对路径的回退机制自动在在ResourceLocation.xap所在的目录,本例即为 ResourceLocation.Web--ClientBin 目录中寻找加以引用。两个位置都没有,才会发生错误。
不以"/"开头,则代表的相对位置是引用该图片的XAML文件所在的目录,本例即Page.xaml文件所在的ResourceLocation目录。
(3)、资源文件放置的位置:
当我们把图片A.jpg添加到ResourceLocation项目中后,点击此图片,查看它的属性,在"生成操作"栏我们可以看到默认的选项是Resource,它表明,当我们生成项目时,此资源是打包在程序集中的,此时我们引用它可以写成 Source="p.jpg",按F5运行,可以直接看到图片。
现在,我们如果把此栏的选项选成:Content,则意味着,我们在生成项目时,此资源将会打包进ResourceLocation.xap文件中,在此情况下,我们重新生成项目,按下F5,运行,可以发现,我们再也看不到图片了(当然,我们要确保在ResourceLocation.Web-- ClientBin目录下没有放置此图片 ,否则,系统会到那里去寻找并显示)
先别急,我们对image控件的Source属性进行修改,改成Source="/p.jpg",即:加入一个反斜杠,再F5运行,这下,我们可以看到图片了。
这说明,我们在放置资源时,我们可以:
i、直接把资源文件放在ClienBin文件目录下。此时引用要加入反斜杠。如 Source="/p.jpg"
ii、把资源文件放在与page.xaml同目录下,此时我们有两个选择:
一是把资源文件属性中的“Build Action”栏即:"生成操作"设置为"Resource"。此时资源打包在程序集,此时引用不用加入反斜杠。如 Source="p.jpg"
二是把资源文件属性中的“Build Action”栏即:"生成操作"设置为"Content"。此时资源打包在.xap压缩包中,引时引用该文件则需要以反斜杠开头。如 Source="/p.jpg"
那么,上述放法在性能上有什么区别呢:
因为,不以反斜杠开头的图片资源是嵌入到Silverlight程序中,xap文件直接下载到客户端,所以当数据量较大时,不以反斜杠开头的方式加载程序的时间就过长。
以"/"开头自然就没上述问题,但是,以反斜杠开头的话,在xaml中设计预览看不到,只有程序运行才可以看到。
2、实验二
示范如何在一个程序集引用另一个程序集内的资源,这将用到我们上面手工建立的另一个项目ResourceAssembly,在此项目中我们引入资源即图片 B.jpg,并把其名字改为 p.jpg
然后回到项目ResourceLocation,在此项目的引用项我们选择: 添加引用--项目--选择项目ResourceAssembly,即引入我们手功建立的项目。
下一步我们修改ResourceLocation项目的Page.xaml文件,改为
<Image Height="300" Width="400" Source="/ResourceAssembly;component/p.jpg"></Image>
文件全文为:
按下F5运行可以看到图片。