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

分析silverlight里的URI引用资源文件的各种情况

分析silverlight里的URI引用资源文件的各种情况

参考: [url]http://nerddawg.blogspot.com/2008/03/silverlight-2-demystifying-uri.html[/url]          [url] http://msdn.microsoft.com/en-us/library/cc296240%28VS.95%29.aspx[/url]主要介绍一下在silverlight里的资源文件(图片,视频,字体之类)设置不同的Build Action时在XAML或是后台C#里如何引用的问题.就拿图片文件作例子来介绍各种Build Action的情况(选中一个文件后按F4打开vs属性面板就可以看到Build Action选项,并可以更改)假如我们有两个图片文件分别叫silverlight.png和sl.jpg,把silverlight.png添加到应用的根目录里,和我们的MainPage.xaml文件一个文件夹,sl.jpg放到一个新建的images文件夹里[b]1. Resource: [/b]选择这种生成方式后,该资源文件会被嵌入到该应用的程序集中,就是说打开生成的xap是看不到这个文件的.可以用相对于当前的XAML文件的相对Uri访问,如<Image Source="silverlight.png" />或是<Image Source="./silverlight.png" />,在子文件夹里的可以用<Image Source=”./images/sl.jpg” />访问到最保险的方式是采用特有的程序集资源URI访问,格式为[color=DarkOrange]<Image Source="/{assemblyShortName};component/Foo.jpg"/>[/color],这种方式还可以引用到xap中的其他程序集中的图片修改我们的两个图片的引用方式为[code]<Image Source="/SilverlightApplication1;component/silverlight.png"/><Image Source="/SilverlightApplication1;component/images/sl.jpg" Height="100"/>  [/code]你可以发现一样可以正常显示如果没找到文件的话,系统不会再找别的位置了,会触发ImageFailed事件在Build Action为Resource时,可以用一下几种相对URI来引用资源文件[code]    <Image Source="/SilverlightApplication1;component/silverlight.png" Height="100"/>    <Image Source="./silverlight.PNG" Height="100" />    <Image Source="silverlight.PNG" Height="100" />    <Image Source="/SilverlightApplication1;component/images/sl.jpg" Height="100"/>      <Image Source="./images/sl.jpg" Height="100" />[/code][color=DarkOrange]注意这种生成方式的系统资源可以直接用Application.GetResourceStream(uri).Stream在代码里来得到[/color][b]2. Content:[/b]用这种方式生成XAP后文件会被添加到xap文件中,用压缩工具打开我们生成的xap后可以看到我们的图片文件,silverlight.png在应用的"根"目录,而sl.jpg文件存放在images文件夹中这种情况下,访问这两个图片的相对Uri需要以"/"开始[code]<Image Source="/silverlight.PNG" Height="100" /><Image Source="/images/sl.jpg" Height="100" />[/code][color=DarkOrange]注意在这种方式下,如果没有在xap中找到图片文件,那么silverlight会自动从当前xap应用所在的文件夹下来找所需图片文件,如果还没有找到那么就触发ImageFailed事件,这种方式比较适合在多个程序集引用相同文件时采用[/color][b]3. None:[/b]None表示不作生成处理,我们的图片文件不会被拷贝到XAP文件中,需要考虑的是"copyToOutputDirectory"这个选项,这个选项有三个选择"Do not copy","copy always","copy if newer",因为我们需要引用图片文件,我们可以选择后两个中的一个,这样在项目编译后,可以看到在xap的所在文件里会有一个silverlight.png文件一个images文件夹,sl.jpg文件就在images文件夹里引用文件的Uri方式同第二种Content方式在大多数情况下,我们希望把video/audio文件放到xap的外面,因为这种文件一般都比较大,会影响silverlight应用的加载,而且一般的视频音频文件都是压缩格式的,放到xap中也不会起到减少他们文件大小的作用.类似图片视频这种资源文件生成操作为None时和他们没有被添加到项目里是一样的,都可以用绝对Uri进行引用小结:[i]相对Uri引用:[/i][code]<Image Source="/silverlight.PNG" Height="100" /><Image Source="/images/sl.jpg" Height="100" />[/code][i]绝对路径引用:[/i][code]<Image Source="http://localhost:50235/clientbin/silverlight.PNG" Height="100" /><Image Source="http://localhost:50235/clientbin/images/sl.jpg" Height="100" />[/code][b]4. EmbeddedResource:[/b]这种方式会把文件嵌入到程序集中,silverlight无法通过Uri引用在xaml和c#里对这个文件进行使用,微软不建议在silverlight采用这种方式在程序集里嵌入资源.如果有这种需求可以用[color=DarkOrange]Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream(string path)[/color]相关的方法得到文件的stream引用我建议直接改为第一种的"Resource"方式,然后采用第一种的引用方式就可以了关于Resource方式和EmbeddedResource的不同我不多介绍了,如果感兴趣的话可以用reflector工具打开你的程序集dll文件,在Resources目录下可以看到两者的不同之处,用Resource嵌入的资源会被系统放到AppName.g.resources中,而采用EmbeddedResource方式的资源会被直接放到Resources目录下,其他的细节就不介绍了.

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

相关推荐