SilverLight学习笔记--关于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文件,最终代码如下:

 <UserControl x:Class="ResourceLocation.Page"
    xmlns
="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x
="http://schemas.microsoft.com/winfx/2006/xaml" 
    Width
="400" Height="300">
    
<Grid x:Name="LayoutRoot" Background="White">
       
<Image Height="300" Width="400"  Source=" "></Image>
    
</Grid>
</UserControl>

二、实验过程
 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>
 文件全文为:
 <UserControl x:Class="ResourceLocation.Page"
    xmlns
="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x
="http://schemas.microsoft.com/winfx/2006/xaml" 
    Width
="400" Height="300">
    
<Grid x:Name="LayoutRoot" Background="White">
       
<Image Height="300" Width="400"  Source="/ResourceAssembly;component/p.jpg"></Image>
    
</Grid>
</UserControl>
按下F5运行可以看到图片。
前往:Silverlight学习笔记清单
本文参照了部分网络资料,希望能够抛砖引玉,大家共同学习。
(转载本文请注明出处)
posted @ 2009-07-22 19:59  wsdj  阅读(3846)  评论(2编辑  收藏  举报