• 脸谱不靠谱   2014/8/13 12:52:00
  • 关于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文件,最终代码如下:
    1
    2
    3
    4
    5
    6
    7
    8
    <UserControl x:Class="ResourceLocation.Page"
        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>
     文件全文为:

    1
    2
    3
    4
    5
    6
    7
    8
    <UserControl x:Class="ResourceLocation.Page"
        Width="400" Height="300">
        <Grid x:Name="LayoutRoot" Background="White">
           <Image Height="300" Width="400"  Source="/ResourceAssembly;component/p.jpg"></Image>
        </Grid>
    </UserControl>

    按下F5运行可以看到图片。