微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Silverlight Image Source URI : 一个反斜杠引发的血案

Silverlight2 beta2现在支持的Image格式有jpg和png,部分png编码也不支持,同时有些png在xaml的design预览中不可见,但运行时可见。请看XAML markup中两行代码的异同:
<Image x:Name="img" Source="test.jpg" />
<Image x:Name="img2" Source="/test2.jpg" />

反斜杠forward-slash?有没有虾米区别呢?建立一个名称为pan的Silverlight应用程序工程,解决方案资源管理器如图所示。第一种方式(不以反斜杠开头)的图片test.jpg应该放在pan目录下才可正确引用,而第二种方式,图片test2.jpg必需放在ClientBin目录下,否则会发生ImageError。


为什么呢?反斜杠开头说明该URI是一个相对路径,而程序运行时的根目录为ClientBin,因此test2.jpg的位置应该调整。不过此时在XAML的design预览试中看不到test2.jpg图片

如果图片一样,那么运行结果是相同。如此一来,究竟选择哪种方式呢?分别把两种方式的xap文件重命名为zip,解压之,并用reflector反编译其中的dll文件,可以看到第一种方式(没有/)resource里包含了test图片,而第二种方式resource里却没有test2图片。由此可知,第一种方式把图片嵌入到Silverlight程序中直接下载到客户端,而第二种方式则按需索取(on-demand),当显示时再去下载。当数据量较大时,第一种方式加载程序的时间就过长,用户体验不好。而第二种方式优势就比较明显,只不过在xaml设计时预览不方便,此时可以先把需要显示图片除了放在ClientBin目录下外,亦可先复制一份放在pan目录下供设计使用,程序发布时再删除

+++++++++++++++++++++++他们都说我是分割线+++++++++++++++++++++++++++++

事实上,不止是图片,音频、视频,甚至XML和XAML等non-executable data files都是resource文件,处理方式类似。若深究,则资源文件可细分为Resource files 、Content files 、Site of origin files,可参考 Silverlight Documentation的相关章节。参考下面的Silverlight Application组成,LionGG简单讲解下。
  


凡嵌入在Application Assembly或Library Assembly里的资源都叫Resource files;凡打包进去发布的资源都Content files,当打包文件xap中仅有一个程序集即Application Assembly时,Resource files等于Content files;按需索取并且没有嵌入到任何程序集中的资源叫Site of origin files。

参考图中从左向右,从上往下,分别命名为resource1、2、3、4、5的话,则1、2、4为Resource files,1、2、3Content files,5为Site of origin files。具体到我们的示例,则test.jpg是Resource files也是Content files,而test2.jpg则属于Site of origin files。

+++++++++++++++++++++++不好意思我又出现了+++++++++++++++++++++++++++++

除了在XAML中直接确定Image的Source URI,当然也可以在后台代码中确定,此时反斜杠的用法和XAML中相通。
C#:Image img1 = new Image();
img1.source = new BitmapImage(new Uri("test.jpg",UriKind.Relative));      //pan目录
//img1.source = new BitmapImage(new Uri("/test2.jpg",UriKind.Relative)); //ClientBin目录 话说要是使用诸如http://www.liongg.net/test.jpg之类绝对URI就没反斜杠什么事了。还可以利用Application.Current.Host.source.AbsolutePath等方法.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐