WP7开发解惑(转载)
2011-10-13 10:23
253 查看
很多初学WindowsPhone7开发的朋友经常因为资源文件的BuildAction属性设置不当而导致图片无法显示、多媒体文件无法访问之类的问题。在WindowsPhone7中,资源文件的BuildAction属性通常有Content/Resource/None三个可选值,那么究竟设置为哪一个才合适呢?下面我们就这一问题进行简单的探索。
如图所示,我们添加两个视频文件video1.wmv、video2.wmv到项目中的Medias文件夹。
并分别设置其BuildAction属性为Content、Resource。
按F6键编译项目。然后到项目的bin/Debug文件夹中找到编译生成的xap文件,将其后缀改为zip(对Silverlight有所了解的朋友应该清楚,一个Xap文件实际上就是一个zip压缩包)。
用压缩软件打开该zip文件,在其中的Medias文件夹中将看到vedio1.wmv文件以独立文件的形式存在于压缩包中(右图)。
那么vieo2.wmv文件哪里去了呢?注意观察左图中DemoCode1.dll文件的大小---10M多!!!你猜的没错,vieo2.wmv就是被嵌入到了这个dll文件中。
那么设置为None的情况又是如何呢?实际上试过之后你会发现,设置为None的资源文件既不会直接打包在xap文件中,也不会嵌入xap中的dll内,编译过程会完全忽略该资源文件。那么以下的探讨中也将忽略BuildAction设置为None的情况。
那么通过以上测试我们可以总结如下:
BuildAction属性设置为Conten的文件将被作为独立文件直接打包在xap文件中
BuildAction属性设置为Resource的文件将被嵌入到xap包中的dll文件内
BuildAction属性设置为None的文件,将不会存以任何形式在于xap包中
多数情况下,两种形式都可以使用,但是以下情况使用Content更为便捷:
一般情况下,使用Content时,资源文件的URI更为简洁,而Resource相对繁琐一些。
e.g.如video1.wmv文件通常可通过URI“/Medias/video1.wmv”访问,
而video2.wmv则需要“[项目名];component/Medias/video1.wmv"访问(XAML中除外)
由于使用Content时,文件是直接打包在项目中,因此对于需要批量打包生成xap文件的场景,只能用Content。
对于多媒体文件,务必使用Content形式以取得更佳的性能。
MSDN文档原文:
“MediaprocessingonWindowsPhone7isoptimizedtousefilesandnetworkstreams,butnotin-memorystreams.Thismeansthatanymediafilesincludedintheapplication,suchassoundeffects,shouldhavetheirBuildActionsettoContentandnotResource.”
“WindowsPhone上的多媒体处理针对文件和网络流做了优化,而内存流没有。这就意味着包含在应用程序中任何媒体文件,如声音效果等,应该设置其BuildAction属性为Content而不是Resource。”
更详细解释参考WPMind的WP7Dev101【7】选择BuildAction
对于以下场景,使用Resource可能更合适:
需要避免异步加载的资源文件应当使用Resource
e.g.一个典型的场景是Panorama控件的背景图片,如果设置为Content在首次显示页面时会有闪烁。MSDN文档原文:
“IfaPanoramacontrolisusinganimageforthebackground,itsBuildActionshouldbesettoResource;otherwise,itwillnotappearimmediatelywhentheapplicationisfirstdisplayed.SettingtheBuildActiontoContentwouldcauseittobeloadedasynchronously.”
“如果Panorama控件使用图片作为背景,其BuildAction属性应当色号之为Resource;否则,当应用程序手册显示时图片将不会立即呈现。将BuildAction设置为Content属性会导致其异步加载。”
很多用作背景的图片都和上例相仿
使用Resource可以比Content更好的保护自己Xap包中的资源文件(如自己辛苦设计的图片等)。
这很容易理解,因为Content时资源文件直接以文件形式存在于Xap包中,别人拿到Xap解压后也就拿到了你的资源文件。而Resource时嵌入在dll文件中,获取相对麻烦些(但也不是完全安全)。
需要从C#代码中动态访问的资源文件(如XML文件等),需要设置为Resource。欲了解详情请参考下一课介绍的场景。
BuildAction属性,VS项目中的所有文件都有BuildAction属性,如xaml文件、cs文件等,只是一般情况下我们不需要改动这些文件的BuildAction属性而已。点此了解更多BuildAction相关介绍。
下载:点此下载DemoCode
疑惑1:BuildAction属性设置为Content/Resource/None的资源有何区别?
这个问题我们通过一个简单的测试来解答。为了容易观察,我们选择两个较大的视频文件(每个10M左右)作为资源文件进行测试。如图所示,我们添加两个视频文件video1.wmv、video2.wmv到项目中的Medias文件夹。
并分别设置其BuildAction属性为Content、Resource。
按F6键编译项目。然后到项目的bin/Debug文件夹中找到编译生成的xap文件,将其后缀改为zip(对Silverlight有所了解的朋友应该清楚,一个Xap文件实际上就是一个zip压缩包)。
用压缩软件打开该zip文件,在其中的Medias文件夹中将看到vedio1.wmv文件以独立文件的形式存在于压缩包中(右图)。
那么vieo2.wmv文件哪里去了呢?注意观察左图中DemoCode1.dll文件的大小---10M多!!!你猜的没错,vieo2.wmv就是被嵌入到了这个dll文件中。
那么设置为None的情况又是如何呢?实际上试过之后你会发现,设置为None的资源文件既不会直接打包在xap文件中,也不会嵌入xap中的dll内,编译过程会完全忽略该资源文件。那么以下的探讨中也将忽略BuildAction设置为None的情况。
那么通过以上测试我们可以总结如下:
BuildAction属性设置为Conten的文件将被作为独立文件直接打包在xap文件中
BuildAction属性设置为Resource的文件将被嵌入到xap包中的dll文件内
BuildAction属性设置为None的文件,将不会存以任何形式在于xap包中
疑惑2:BuildAction选择Content还是Resource?
根据目前的使用经验,简单总结如下。多数情况下,两种形式都可以使用,但是以下情况使用Content更为便捷:
一般情况下,使用Content时,资源文件的URI更为简洁,而Resource相对繁琐一些。
e.g.如video1.wmv文件通常可通过URI“/Medias/video1.wmv”访问,
而video2.wmv则需要“[项目名];component/Medias/video1.wmv"访问(XAML中除外)
由于使用Content时,文件是直接打包在项目中,因此对于需要批量打包生成xap文件的场景,只能用Content。
对于多媒体文件,务必使用Content形式以取得更佳的性能。
MSDN文档
“MediaprocessingonWindowsPhone7isoptimizedtousefilesandnetworkstreams,butnotin-memorystreams.Thismeansthatanymediafilesincludedintheapplication,suchassoundeffects,shouldhavetheirBuildActionsettoContentandnotResource.”
“WindowsPhone上的多媒体处理针对文件和网络流做了优化,而内存流没有。这就意味着包含在应用程序中任何媒体文件,如声音效果等,应该设置其BuildAction属性为Content而不是Resource。”
更详细解释参考WPMind的
对于以下场景,使用Resource可能更合适:
需要避免异步加载的资源文件应当使用Resource
e.g.一个典型的场景是Panorama控件的背景图片,如果设置为Content在首次显示页面时会有闪烁。MSDN文档
“IfaPanoramacontrolisusinganimageforthebackground,itsBuildActionshouldbesettoResource;otherwise,itwillnotappearimmediatelywhentheapplicationisfirstdisplayed.SettingtheBuildActiontoContentwouldcauseittobeloadedasynchronously.”
“如果Panorama控件使用图片作为背景,其BuildAction属性应当色号之为Resource;否则,当应用程序手册显示时图片将不会立即呈现。将BuildAction设置为Content属性会导致其异步加载。”
很多用作背景的图片都和上例相仿
使用Resource可以比Content更好的保护自己Xap包中的资源文件(如自己辛苦设计的图片等)。
这很容易理解,因为Content时资源文件直接以文件形式存在于Xap包中,别人拿到Xap解压后也就拿到了你的资源文件。而Resource时嵌入在dll文件中,获取相对麻烦些(但也不是完全安全)。
需要从C#代码中动态访问的资源文件(如XML文件等),需要设置为Resource。欲了解详情请参考下一课介绍的场景。
扩展知识
实际上,不仅是资源文件可以设置下载:
相关文章推荐
- WP7开发解惑(1):BuildAction之Content与Resource
- WP7开发解惑:BuildAction之Content与Resource
- WP7开发解惑(2):如何从安装文件夹拷贝文件到独立存储
- 传道解惑 软件开发技术名词解密(转载)
- C#多线程 使用委托更新UI实例(WP7开发 其他线程中更新UI)(转载)
- [转载]基于arm+uClinux的嵌入式系统的开发
- 转载:IOS开发网络篇之──ASIHTTPRequest下载示例(支持断点续传)
- 多线程开发之NSThread——子线程模拟耗时操作(★★★虽是转载,但是附上了个人理解,firecat推荐★★★)
- 【转载】 iphone使用NSOperationQueue简化多线程开发
- 转载:Web 设计与开发终极资源大全
- 郑晔谈 Java 开发:新工具、新框架、新思维【转载】【整理】
- 转载一篇好文章:Qt for S60开发环境全接触
- 用MyEclipse10开发基于JAX-WS的Web Service实例 (转载)
- 构件化:ERP软件开发新模式(转载)
- C#开发微信公众平台-就这么简单(转载)(附原文链接)
- [转载红鱼儿]kbmmw 开发点滴:kbmMW缓存机制
- [转载]在Windows下搭建Android开发环境
- (转载)比较流行的手机开发平台综述
- 转载:使用Eclipse与Pydev开发Python
- Apache Thrift - 可伸缩的跨语言服务开发框架 ---转载