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

Silverlight Image Source URI : 一个反斜杠引发的血案,第1张

概述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" /> 反斜杠forwa 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等方法. 总结

以上是内存溢出为你收集整理的Silverlight Image Source URI : 一个反斜杠引发血案全部内容,希望文章能够帮你解决Silverlight Image Source URI : 一个反斜杠引发的血案所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1053813.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-25
下一篇 2022-05-25

发表评论

登录后才能评论

评论列表(0条)

保存