(转载)WindowsPhone问题笔记-- 正确选择build action 解决媒体资源无法读取问题

链接:http://www.cnblogs.com/qinxg/archive/2012/07/17/2594503.html

在开发过程中遇到了图片加载器与视频播放器无法正常读取媒体资源的问题。

在代码中 图片路径是正确的,图片无法正常读出。而视频部分采取相同的代码,却可以正常读出。

读取图片代码如下:

读取视频代码如下:

(转载)WindowsPhone问题笔记-- 正确选择build action 解决媒体资源无法读取问题

其中2个的地址相似都为:/Assets/XXXX/XXX.XXX

读取图片错误信息如下:

后对比视频文件与图片文件时发现问题。

原来图片和视频的生成操作(build action)设置有差别。

视频的为:内容(content)                                             图片的为:Rescoure

查阅MSDN后发现,两种生成操作最后获取资源有很大的差异,并且对性能有很大影响。

首先介绍build action

Action

说明

None

资源既不会被集成到程序集内,也不会打包到xap包中。不过我们可以通过设置CopyToOutputDirectory选项让其自动拷贝到xap包所在目录。 这种情况下, 访问这个图片的相对Uri需要以"/"开始。

适用场景:在大多数情况下,我们希望把video/audio文件放到xap的外面,因为这种文件一般都比较大,会影响silverlight应用的加载,而且一般的视频音频文件都是压缩格式的,放到xap中也不会起到减少他们文件大小的作用。 类似图片视频这种资源文件生成操作为None时和他们没有被添加到项目里是一样的,都可以用绝对Uri进行引用。

Compile

不适合用于资源文件。类文件要用"Compile"生成操作, 就是指项目里.cs或.vb文件。

Content

资源会被打包在Xap包里面。这种情况下, 访问这个图片的相对Uri需要以"/"开始。在这种方式下,如果没有在xap中找到图片文件,那么silverlight会自动从当前xap应用所在的文件夹下来找所需图片文件, 如果还没有找到那么就触发ImageFailed事件, 这种方式比较适合在多个程序集引用相同文件时采用。

Embedded Resource

这种方式会把文件嵌入到程序集中,Silverlight无法通过Uri引用在xaml和C#里对这个文件进行使用,微软不建议在Silverlight采用这种方式在程序集里嵌入资源。如果有这种需求可以用Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream(string path)相关的方法得到文件的Stream引用。

ApplicationDefinition

Silverlight程序的入口xaml文件(默认就是App.xaml)应该设置为这个"应用定义"。其他文件都不适合用这个。

Page

不适合用于资源文件。所有的用户控件,页面和子窗体(Usercontrol/Page/Childwindow)的xaml文件应该采用的生成操作。 如果改为别的方式那么会导致后台对应的代码文件无法链接到这个xaml文件。 采用"Page" build action时xaml里的错误会导致工程无法正确生成。

CodeAnalysisDictionary

代码分析使用,Silverlight中可以忽略

Resource

资源会被打包在程序集内部。 选择这种生成方式后,该资源文件会被嵌入到该应用的程序集中,就是说打开生成的xap是看不到这个文件的。 可以用相对于当前的XAML文件的相对Uri访问,<Image Source="sl.png" />或是<Image Source="./sl.png" />, 在子文件夹里的可以用<Image Source=”./images/sl.png” />访问到。最保险的方式是采用特有的程序集资源URI访问,格式为 <Image Source="/{assemblyShortName};component/sl.png"/>,这种方式还可以引用到xap中的其他程序集中的图片。这种生成方式的系统资源可以直接用Application.GetResourceStream(uri).Stream在代码里来得到。

SplashScreen

"SplashScreen"是这个选项是WPF的启动画面使用的。Silverlight启动加载画面是用的其他方式实现的,所以在Silverlight里不要用这个方式。

EntityDeploy

这个是EntityFramework采用的生成方式,在Silverlight里是没用。

需要关注的是,对于媒体资源通常使用ContentResource两种不同的方式。

 

采取Content时,资源会被打包在Xap包里面。这种情况下, 访问这个图片的相对Uri需要以"/"开始。在这种方式下,如果没有在xap中找到图片文件,那么silverlight会自动从当前xap应用所在的文件夹下来找所需图片文件, 如果还没有找到那么就触发ImageFailed事件, 这种方式比较适合在多个程序集引用相同文件时采用。

获取媒体资源方式:直接采用/文件夹/文件即可获取到资源文件。

采用Resource时,资源会被打包在程序集内部。 选择这种生成方式后,该资源文件会被嵌入到该应用的程序集中,就是说打开生成的xap是看不到这个文件的。 可以用相对于当前的XAML文件的相对Uri访问,<Image Source="sl.png" />或是<Image Source="./sl.png" />, 在子文件夹里的可以用<Image Source=”./images/sl.png” />访问到。最保险的方式是采用特有的程序集资源URI访问,格式为 <Image Source="/{assemblyShortName};component/sl.png"/>,这种方式还可以引用到xap中的其他程序集中的图片。这种生成方式的系统资源可以直接用Application.GetResourceStream(uri).Stream在代码里来得到。

 

获取媒体资源方式:/{assemblyShortName};component/sl.png 的方式来获取,其中assemblyShortName为程序集名称。

本次问题中,针对图片文件使用了 Resource,而视频文件使用了Content。所以出现了上图问题。

在MSDN中说明,出于性能考虑,媒体资源需要设置为 内容(Content),说明如下:

对 Windows Phone 上的媒体处理进行优化以使用文件和网络流,而不是使用内存中的流。这意味着应用程序中包括的任何媒体文件(例如声音效果)应该将其生成操作设置为内容而不是资源。当媒体文件作为内容编译时,它会作为松散文件与应用程序文件 (.XAP) 一起存储,而不是存储在应用程序文件中。当媒体文件作为资源编译时,通常通过检索文件流来访问,这可能会降低性能。此外,当播放编译为内容的媒体文件时,会直接进行播放。当媒体文件作为资源编译时,播放之前需要将内容复制到 Windows Phone 上的文件,这会降低性能。

参考地址:http://msdn.microsoft.com/zh-cn/library/ff967560(v=VS.92).aspx

http://www.cnblogs.com/listenfly/archive/2011/11/03/2235059.html

WP8.1开发中关于媒体(图片)文件的生成操作,属性如何设置(内容/嵌入资源等);的更多相关文章

  1. java关于Timer schedule执行定时任务 1、在应用开发中,经常需要一些周期性的操作,比如每5分钟执行某一操作等

    1.在应用开发中,经常需要一些周期性的操作,比如每5分钟执行某一操作等.对于这样的操作最方便.高效的实现方式就是使用java.util.Timer工具类. private java.util.Time ...

  2. 编写Java程序,在硬盘中选取一个 txt 文件,读取该文档的内容后,追加一段文字“[ 来自新华社 ]”,保存到一个新的 txt 文件内

    查看本章节 查看作业目录 需求说明: 在硬盘中选取一个 txt 文件,读取该文档的内容后,追加一段文字"[ 来自新华社 ]",保存到一个新的 txt 文件内 实现思路: 创建 Sa ...

  3. WP8.1开发中关于如何显示.gif格式动态格式图片方法

    这几天又遇到个问题,就是如何显示动态图片,本来以为和显示静态图片一样,谁知不行,在网上一查才知道WP8.1不支持.gif格式动态图片的显示: 后来又在MSDN论坛上查找,也有人问类似的问题,后来就大概 ...

  4. 在Android开发中替换资源图片不起作用的解决方法

    现象 在android开发中,经常会需要替换res\drawable中的图片,打开res\layout下的文件预览布局页面发现图片已经被替换,但在模拟器或者真实机器上运行时发现该图片并没有被替换,还是 ...

  5. 读书笔记-详解C程序开发中 .c和.h文件的区别

    一个简单的问题:.c和.h文件的区别 学了几个月的C语言,反而觉得越来越不懂了.同样是子程序,可以定义在.c文件中,也可以定义在.h文件中,那这两个文件到底在用法上有什么区别呢? 2楼: 子程序不要定 ...

  6. c++中.dll与.lib文件的生成与使用的详解

    两种库: • 包含了函数所在的DLL文件和文件中函数位置的信息(入口),代码由运行时加载在进程空间中的DLL提供,称为动态链接库dynamic link library.• 包含函数代码本身,在编译时 ...

  7. Vs2012在Linux开发中的应用(5):项目属性的定义

    VS的项目属性表实际上是由一系列的XML文件定义的,都存放在C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V110\2052文件夹下.我们全然能够 ...

  8. WP8.1开发中找程序下的Assets文件夹

    这俩天在开发另一个程序时,遇到一个小问题:如何调用程序下的Assets文件夹及其下的文件和文件夹: 在网上找了两天,基本上是关于如何调用手机中库的方法,没找到有关介绍如何调用查找 编译前添加图片或其它 ...

  9. Unity3D研究院之手游开发中所有特殊的文件夹(转)

    这里列举出手游开发中用到了所有特殊文件夹. 1.Editor Editor文件夹可以在根目录下,也可以在子目录里,只要名子叫Editor就可以.比如目录:/xxx/xxx/Editor  和 /Edi ...

随机推荐

  1. java 位操作的总结

    2014-05-07 17:14 今天工作上需要一个Byte的低5位,高3位.所以查询了资料.总结下如何实现 百度到一个资料: 介绍的很详细 基础知识: http://www.blogjava.net ...

  2. webgl 网站demo

    网络上的一些经典的WebGL资源网站和WebGL开源引擎整理 http://www.babylonjs.com/ http://threejs.org/ http://www.finalmesh.co ...

  3. linux 下source、sh、bash、./执行脚本的区别

    原文地址:http://blog.csdn.net/caesarzou/article/details/7310201 source命令用法: source FileName 作用:在当前bash环境 ...

  4. BZOJ2733 永无乡【splay启发式合并】

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...

  5. 【中国人大:天地人大BBS站】迟到的求职感悟

    转自 http://i.cnblogs.com/EditPosts.aspx?opt=1 研究生最后一年,我参加了一个500强外企实习,单纯幼稚的小姑娘立马被白领工作的那种光鲜亮丽给迷惑了,同时听说可 ...

  6. Swift之UITabBarController 导航控制器颜色的改变

    废话不多 直接上代码 self.window = UIWindow(frame: UIScreen.mainScreen().bounds) self.window!.backgroundColor ...

  7. c#使用DotNetZip封装类操作zip文件(创建/读取/更新)实例

    DotnetZip是一个开源类库,支持.NET的任何语言,可很方便的创建,读取,和更新zip文件.而且还可以使用在.NETCompact Framework中.  下载地址在这里:http://dot ...

  8. Flex 开发框架汇总

    1.现有成熟Flex框架   Cairngorm (Adobe Open Source) - MVC framework   PureMVC (Open Source) - MVC framework ...

  9. Bootstrap入门(十三)组件7:导航条

    Bootstrap入门(十三)组件7:导航条 1.默认样式的导航条 2.嵌入表单和按钮 3.嵌入文本和非导航的链接 4.组件排列和下拉菜单 5.固定在顶部/底部 6.反色的导航条 7.路径导航 首先先 ...

  10. JavaScript中DOM的层次节点(一)

    DOM是针对HTML和XML文档的一个API,描绘了一个层次化的节点树,允许开发人员添加.修改.删除节点的一部分. DOM将HTML和XML文档描绘成一个有多个节点构成的结构,节点分为12种不同的节点 ...