Windows Phone 7 工程 BuildAction 選項-Content 與 Resource 的使用

fmms 12年前發布 | 25K 次閱讀 Windows Phone開發 移動開發 Windows Phone

很多初學Windows Phone 7開發的朋友經常因為資源文件的BuildAction屬性設置不當而導致圖片無法顯示、多媒體文件無法訪問之類的問題。在Windows Phone 7中,資源文件的BuildAction屬性通常有Content/Resource/None三個可選值,那么究竟設置為哪一個才合適呢?下面我們就這 一問題進行簡單的探索。
Windows Phone 7 工程 BuildAction 選項-Content 與 Resource 的使用

疑惑1:BuildAction屬性設置為Content/Resource/None的資源有何區別?

這個問題我們通過一個簡單的測試來解答。為了容易觀察,我們選擇兩個較大的視頻文件(每個10M左右)作為資源文件進行測試。
如圖所示,我們添加兩個視頻文件video1.wmv、video2.wmv到項目中的Medias文件夾。
Windows Phone 7 工程 BuildAction 選項-Content 與 Resource 的使用
并分別設置其BuildAction屬性為Content、Resource。
Windows Phone 7 工程 BuildAction 選項-Content 與 Resource 的使用 Windows Phone 7 工程 BuildAction 選項-Content 與 Resource 的使用
按F6鍵編譯項目。然后到項目的bin/Debug文件夾中找到編譯生成的xap文件,將其后綴改為zip(對Silverlight有所了解的朋友應該清楚,一個Xap文件實際上就是一個zip壓縮包)。
Windows Phone 7 工程 BuildAction 選項-Content 與 Resource 的使用 Windows Phone 7 工程 BuildAction 選項-Content 與 Resource 的使用
用壓縮軟件打開該zip文件,在其中的Medias文件夾中將看到vedio1.wmv文件以獨立文件的形式存在于壓縮包中(右圖)。

那么vieo2.wmv文件哪里去了呢?注意觀察左圖中DemoCode1.dll文件的大小---10M多!!!你猜的沒錯,vieo2.wmv就是被嵌入到了這個dll文件中。
Windows Phone 7 工程 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屬性而已。

 

轉帖自:DevDiv.com

 本文由用戶 fmms 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!