Silverlight编程 之 路径问题


相对路径与绝对路径

本文来自: http://www.cnblogs.com/sutengcn/archive/2008/08/17/201993.html

1,相对路径与绝对路径
        文档路径类型一共有三种:绝对路径、根相对路径和文档相对路径。

  绝对路径是包括服务器协议(在本例中为http协议)的完全路径,比如“洪恩在线——电脑乐园”,完全路径为:http://www.hongen.com/pc/index.htm ,如果所要链接当前站点之外的文档,就必须使用绝对路径。

  相对路径包括根相对路径 (Site Root)和文档相对路径 (Document)两种。
  
前面我们讲过,在本地磁盘上编辑网页时,需要选定一个文件夹来定义本地站点,模拟服务器上的根文件夹,系统就根据这个文件夹来确定所有链接的本地文件位置,而跟相对路径中的根就是指这个文件夹。

  跟相对路径(也称相对跟目录) 的 路径以“/”开头,路径是从当前站点的根目录开始计算。比如我们前面建的D盘myweb目录就是名为“myweb”的站点,这时“/index.htm” 路径,就表示文件位置为D:/myweb/index.htm。根相对路径适用于链接内容频繁更换环境中的文件,这样即使站点中的文件被移动了,其链接仍 可以生效。

  如果目录结构过深,在引用根目录下的文件时,用跟相对路径会更好些。比如某一个网页文件中引用根目录下img目录中 的一个图,在当前网页中用文档相对路径表示为:“http://www.cnblogs.com/http://www.cnblogs.com/.. /img/a.gif”,而用跟相对路径只要表示为“/img/a.gif”就行了。

  注意:在预览文件时,用根相对路径链接的内容在本地浏览器中不会显示出来,这是因为浏览器不承认站点的根文件夹为服务器。

  这时我们可以将站点的根目录虚拟为一个盘。比如要浏览D:/myweb下的文件,可以选择Windows“开始”菜单中的“运行”,弹出运行对话框

  输入“SUBST I: d:/myweb”,D盘下的myweb文件夹就被虚拟为I盘,用浏览器查看I盘下网页,用根相对路径链接的内容都可以正常显示了。

  文档相对路径 就是指包含当前文档的文件夹,也就是以当前网页所在文件夹为基础开始计算路径。比如,当前网页所在位置为D:/myweb/mypic,那么:

  “a.htm”就表示D:/myweb/mypic/a.htm;

  “../a.htm”相当于D:/myweb/a.htm,其中“../”表示当前文件夹上一级文件夹。

  “img/a.gif”是指D:/myweb/mypic/img/a.gif,其中“img/”意思是当前文件夹下名为img文件夹。

  文档相对路径是最简单的路径,一般多用于链接保存在同一文件夹中的文档

 

Silverlight中的“/”

 

本文来自:http://hi.baidu.com/liongg/blog/item/b91a495494e34152564e00b4.html

Silverlight2 现在支持的Image格式有jpg和png,部分png编码也不支持,同时有些png在xaml的design预览中不可见,但运行时可见。请看XAML markup中两行代码的异同:
<StackPanel Background="White" Orientation="Vertical">
        <Image x:Name="blue" Source="/images/blue.png" Stretch="None"/>
        <Image x:Name="green" Source="images/green.png" Stretch="None" />
</StackPanel>

反 斜杠forward-slash?有没有虾米区别呢?如图所示,名称为Resource测试示例解决方案资源管理器以及运行效果:以反斜杠开头的blue 图片需要放在ClientBin目录下的相应文件夹里;不以反斜杠开头的green图片应该放在Resource目录下的相应文件夹里。这样才可正确引 用,否则会发生ImageError。

 


为什么?两者都是相对路径,到底反斜杠带来了什么区别呢?反斜杠开头 的相对路径,代表的相对位置是应用程序运行的根目录,即.xap压缩包内, 若在这其中寻找不到要引用的文件,则相对路径的回退机制(fallback mechanism )自动在在.xap所在的目录 ,本例即为ClientBin目录中寻找加以引用。两个位置都没有,才会发生错误。不以"/"开头 ,则代表的相对位置是引用该图片的XAML文件所在的目录 ,本例即page.xaml文件所在的Resource目录。

那 么究竟选择哪种方式呢?把xap文件重命名为zip文件,解压之,再用reflector反编译其中的dll文件,发现其包含了green图片,却没有 blue图片。其实也很明显,blue所在的images文件夹与.xap同级,自然不会包含在内。由此可知,不以反斜杠开头的green图片嵌入到 Silverlight程序中的xap文件直接下载到客户端,而blue图片则按需索取(on-demand),当显示时再去下载。当数据量较大时,不以 反斜杠开头的方式加载程序的时间就过长,用户体验不好,以"/"开头自然就无此无虑,不过以反斜杠开头的话,在xaml中设计预览看不到,只有程序运行才 可以看到。(若为了预览,可先从ClienBin那里复制一份放在page.xaml同级目录下供设计使用,程序发布时予以删除。)
        
除了在XAML中直接确定Image的Source URI,当然也可以在code-behind中确定,此时反斜杠的用法和XAML中相通。
C#:Image img = new Image();
img.Source = new BitmapImage(new Uri("test.jpg", UriKind.Relative));      //page.xaml所在目录下
//img.Source = new BitmapImage(new Uri("/test.jpg", UriKind.Relative)); //.xap所在目录下

话 说要是使用诸如http://www.liongg.net/test.jpg之类绝对URI就没反斜杠什么事了。在代码中还可以利用 Application.Current.Host.Source.AbsolutePath等方法,我试验下了,发觉太麻烦还没意思,不再多管。

再深入一点,甚至图片放在与page.xaml同级的文件夹下,一样可以使用反斜杠进行引用。只需要在相应图片的属性里,把Build Action选择为"Content"即可,不过该图片还是被放到.xap压缩包里了,这是后话,参见《Sivlerlight Resource 概览 》。

 

Sivlerlight Resource 概览

 

本文来源:http://hi.baidu.com/liongg/blog/item/c258f8194c02ec7cdab4bd4f.html

 

图片,音频、视频,甚至XML和XAML等非执行数据文件都叫做资源,根据资源所处位置的不同而有所区别,先了解下Silverlight 应用程序的结构。

 

在.xap压缩包中,有一个Appmanifest.xaml文件,定义了打包的程序集和应用程序入口;一个application程序集;0个或 多个library程序集;0个或多个资源文件,如图片、视频等。整个.xap在应用程序激活之前都已经下载到客户本地,而on-demand文件,顾名 思义,需要的时候再予以加载。

 

 

由此可见,资源文件可分布在多个位置,如镶嵌入程序集内;在.xap压缩包内而不镶嵌入任何程序集内;不在程序集内也不 在.xap内。当在工程中添加一个资源如pink.png图片时,右键之,选择属性,可以在“Build Action”中,分别选择Resource、Content 和 None 可使资源文件生成在对应上述三个位置。(官方文档说其他选项在Silverlight中没什么作用,但事实上Embedded Resource也是有作用的,见《用反射来动态加载XAML 》)

 

 

 

在工程中引入资源文件,即引入在与page.xaml同目录下,默认的“Build Action”选项是“Resource”,即镶嵌入相应程序集内,这时引用该资源不应该以反斜杠开头。若把资源文件放在ClienBin同目录下,则相 当于None,引用时需要以反斜杠开头。可参见《Silverlight Image Source URI 》一文,理解是否以反斜杠开头的区别。

 

 

        不建议把资源文件放在page.xaml同目录下,然后选择“Build Action”为“None”,换句话说,若不想资源文件打包进 .xap中,直接把资源文件放在ClienBin文件目录下 。但可以把page.xaml同目录下的资源文件属性 中的 Build Action”改为“Content”,使其放在.xap压缩包中,方便.xap中多个程序集的共同使用。 既然此时资源文件在.xap压缩包内,引用该文件则需要以反斜杠开头。这就是《Silverlight Image Source URI》一文最后提到的,为什么资源文件放在page.xaml同目录下,却可以使用反斜杠开头来引用。示例代码和运行结果如下。

<StackPanel Background="White" Orientation="Vertical">
        <Image x:Name="blue" Source="/images/blue.png" Stretch="None"/>
        <Image x:Name="green" Source="images/green.png" Stretch="None" />
        <Image x:Name="pink" Source="/images/pink.png" Stretch="None" />
</StackPanel>

对应Silverlight应用程序结构,本示例三个资源文件,ClientBin目录下(包含下级目录,只不过把所有 Image都放在一个文件夹里了)的blue.png是按需索取的松散资源,没有镶嵌到任何程序集内;page.xaml同目录下的green.png的 Build Action是Resource,最终其被生成在.xap压缩包内的dll文件中,即镶嵌到了application程序集中;而pink.png由于 Build Action被更改为Content,生成后,其位于.xap压缩包内,(故而需要反斜杠开头来引用)但不在任何程序集。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值