欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

WP7开发解惑(1):BuildAction之Content与Resource

程序员文章站 2022-08-17 16:46:11
  很多初学windows phone 7开发的朋友经常因为资源文件的buildaction属性设置不当而导致图片无法显示、多媒体文件无法访问之类的问题。在windows phone...

 

很多初学windows phone 7开发的朋友经常因为资源文件的buildaction属性设置不当而导致图片无法显示、多媒体文件无法访问之类的问题。在windows phone 7中,wp7e5bc80e58f91e8a7a3e68391efbc881efbc89efbc9abuildactione4b98bcontente4b88eresource.x" target="_blank">资源文件的buildaction属性通常有content/resource/none三个可选值,那么究竟设置为哪一个才合适呢?下面我们就这一问题进行简单的探索。

WP7开发解惑(1):BuildAction之Content与Resource

疑惑1:buildaction属性设置为content/resource/none的资源有何区别?

这个问题我们通过一个简单的测试来解答。为了容易观察,我们选择两个较大的视频文件(每个10m左右)作为资源文件进行测试。

如图所示,我们添加两个视频文件video1.wmv、video2.wmv到项目中的medias文件夹。

WP7开发解惑(1):BuildAction之Content与Resource

并分别设置其buildaction属性为content、resource。

WP7开发解惑(1):BuildAction之Content与ResourceWP7开发解惑(1):BuildAction之Content与Resource

按f6键编译项目。然后到项目的bin/debug文件夹中找到编译生成的xap文件,将其后缀改为zip(对silverlight有所了解的朋友应该清楚,一个xap文件实际上就是一个zip压缩包)。

WP7开发解惑(1):BuildAction之Content与ResourceWP7开发解惑(1):BuildAction之Content与Resource

用压缩软件打开该zip文件,在其中的medias文件夹中将看到vedio1.wmv文件以独立文件的形式存在于压缩包中(右图)。

那么vieo2.wmv文件哪里去了呢?注意观察左图中democode1.dll文件的大小---10m多!!!你猜的没错,vieo2.wmv就是被嵌入到了这个dll文件中。

WP7开发解惑(1):BuildAction之Content与Resource

那么设置为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文档原文
      “media processing on windows phone 7 is optimized to use files and network streams, but not in-memory streams. this means that any media files included in the application, such as sound effects, should have their build action set to content and notresource.”
      “windows phone 上的多媒体处理针对文件和网络流做了优化,而内存流没有。这就意味着包含在应用程序中任何媒体文件,如声音效果等,应该设置其buildaction属性为content而不是resource。”
    • 更详细解释参考wpmind的wp7 dev 101 【7】 选择buildaction

对于以下场景,使用resource可能更合适:

  • 需要避免异步加载的资源文件应当使用resource
    • e.g.一个典型的场景是panorama控件的背景图片,如果设置为content在首次显示页面时会有闪烁。msdn文档原文
      “if a panorama control is using an image for the background, its build action should be set to resource; otherwise, it will not appear immediately when the application is first displayed. setting the build action to content would cause it to be loaded asynchronously.”
      “如果panorama 控件使用图片作为背景,其buildaction属性应当色号之为resource;否则,当应用程序手册显示时图片将不会立即呈现。将buildaction设置为content属性会导致其异步加载。”
    • 很多用作背景的图片都和上例相仿
  • 使用resource可以比content更好的保护自己xap包中的资源文件(如自己辛苦设计的图片等)。
    • 这很容易理解,因为content时资源文件直接以文件形式存在于xap包中,别人拿到xap解压后也就拿到了你的资源文件。而resource时嵌入在dll文件中,获取相对麻烦些(但也不是完全安全)。
  • 需要从c#代码中动态访问的资源文件(如xml文件等),需要设置为resource。欲了解详情请参考下一课介绍的场景。
    			 

    扩展知识

    实际上,不仅是资源文件可以设置buildaction属性,vs项目中的所有文件都有buildaction属性,如xaml文件、cs文件等,只是一般情况下我们不需要改动这些文件的buildaction属性而已。了解更多buildaction相关介绍。

     

    下载:点此下载democode


    -------------------magicboy.*.windowsphone7------------------

    爱, 爱上网, 爱三国杀, 也爱和大家一起打dota!!!

    不是总理, 不是委员长, 不是敏感词, 我是winphone7开发者!!!