[转]关于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文件,最终代码如下:

Code
 <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>

  文件全文为:

Code
 <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运行可以看到图片。

转自:http://www.cnblogs.com/star250/archive/2009/10/15/1583665.html

你可能感兴趣的:(编程,Web,silverlight)