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