分析silverlight里的URI引用资源文件的各种情况
2012-04-25 20:41
351 查看
主要介绍一下在silverlight里的资源文件(图片, 视频, 字体之类)设置不同的Build Action时在XAML或是后台C#里如何引用的问题. 就拿图片文件作例子来介绍各种Build Action的情况(选中一个文件后按F4打开vs属性面板就可以看到Build Action选项, 并可以更改) 假如我们有两个图片文件分别叫silverlight.png和sl.jpg, 把silverlight.png添加到应用的根目录里, 和我们的MainPage.xaml文件在一个文件夹, sl.jpg放到一个新建的images文件夹里 1. Resource: 选择这种生成方式后,该资源文件会被嵌入到该应用的程序集中,就是说打开生成的xap是看不到这个文件的. 可以用相对于当前的XAML文件的相对Uri访问, 如<Image Source="silverlight.png" />或是<Image Source="./silverlight.png" />, 在子文件夹里的可以用<Image Source=”./images/sl.jpg” />访问到 最保险的方式是采用特有的程序集资源URI访问,格式为 <Image Source="/{assemblyShortName};component/Foo.jpg"/>, 这种方式还可以引用到xap中的其他程序集中的图片 修改我们的两个图片的引用方式为 <Image Source="/SilverlightApplication1;component/silverlight.png"/> <Image Source="/SilverlightApplication1;component/images/sl.jpg" Height="100"/> 复制代码 你可以发现一样可以正常显示 如果没找到文件的话,系统不会再找别的位置了, 会触发ImageFailed事件 在Build Action为Resource时, 可以用一下几种相对URI来引用资源文件 <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" /> 复制代码 注意这种生成方式的系统资源可以直接用Application.GetResourceStream(uri).Stream在代码里来得到 2. Content: 用这种方式生成XAP后文件会被添加到xap文件中,用压缩工具打开我们生成的xap后可以看到我们的图片文件,silverlight.png在应用的"根"目录, 而sl.jpg文件存放在images文件夹中 这种情况下, 访问这两个图片的相对Uri需要以"/"开始 <Image Source="/silverlight.PNG" Height="100" /> <Image Source="/images/sl.jpg" Height="100" /> 复制代码 注意在这种方式下, 如果没有在xap中找到图片文件, 那么silverlight会自动从当前xap应用所在的文件夹下来找所需图片文件,如果还没有找到那么就触发ImageFailed事件, 这种方式比较适合在多个程序集引用相同文件时采用 3. None: 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进行引用 小结: 相对Uri引用: <Image Source="/silverlight.PNG" Height="100" /> <Image Source="/images/sl.jpg" Height="100" /> 复制代码 绝对路径引用: <Image Source="http://localhost:50235/clientbin/silverlight.PNG" Height="100" /> <Image Source="http://localhost:50235/clientbin/images/sl.jpg" Height="100" /> 复制代码 4. EmbeddedResource: 这种方式会把文件嵌入到程序集中, silverlight无法通过Uri引用在xaml和c#里对这个文件进行使用, 微软不建议在silverlight采用这种方式在程序集里嵌入资源. 如果有这种需求可以用 Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream(string path)相关的方法得到文件的stream引用 我建议直接改为第一种的"Resource"方式, 然后采用第一种的引用方式就可以了 关于Resource方式和EmbeddedResource的不同我不多介绍了, 如果感兴趣的话可以用reflector工具打开你的程序集dll文件, 在Resources目录下可以看到两者的不同之处, 用Resource嵌入的资源会被系统放到AppName.g.resources中,而采用EmbeddedResource方式的资源会被直接放到Resources目录下,其他的细节就不介绍了. [ 本帖最后由 lbx1979 于 2009-7-29 10:33 编辑 ] |
相关文章推荐
- cocos2d-x3.2源码分析(一)类FileUtils--实现把资源放在Resources文件目录下达到多平台的引用
- 莫名其妙的Silverlight资源文件引用问题
- cocos2d-x3.2源码分析之 ---- 类FileUtils实现把资源放在Resources文件目录下达到多平台的引用
- SilverLight学习笔记--关于Silverlight资源文件(如:图片)的放置位置及其引用
- 关于Silverlight资源文件(如:图片)的放置位置及其引用(相对路径)
- 【Cocos2d-x 3.2源码分析】(一)类FileUtils -- 实现把资源放在Resources文件目录下达到多平台的引用
- 莫名其妙的Silverlight资源文件引用问题
- WPF使用路径(URI)引用资源文件
- 引用:silverlight 资源文件路径设置
- 莫名其妙的 Silverlight资源文件引用问题
- cocos2d-x3.2源码分析(一)类FileUtils--实现把资源放在Resources文件目录下达到多平台的引用
- [转载]cocos2d-x3.2源码分析(一)类FileUtils--实现把资源放在Resources文件目录下达到多平台的引用
- 原因分析如下: 遇到这种情况,很有可能是把一个int型业务数据的 设置setText()或者类似的方法中, 这样Android系统就会主动去资源文件当中寻找, 但是它不是一个资源文件ID, 所
- SilverLight学习笔记--关于Silverlight资源文件(如:图片)的放置位置及其引用
- [转]总结MasterPage中的资源文件引用路径
- android不知道R文件路径情况下读取资源
- 樱花大战资源分析之三 ALL和CMP文件格式分析
- CDN的combo技术能把多个资源文件合并引用,减少请求次数
- Cocos2d-x win7 + vs2010 配置(如何创建cocos2d-x工程,解决各种头文件包含错误、lib库引用错误 及dll链接错误)
- .net winform 从资源文件中引用图片资源