我們在Silverlight 項目中,新加一個檔案,比如一個圖檔檔案,這個檔案的屬性會有下面2個選項,這兩個選項決定了這個圖檔資源如何存儲,如何使用。
先說簡單的,資源檔案的 Copy to OutPut Directory 屬性, 這個屬性有如下三個選項:
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIn5GcukDNygjM2MWY0MmNihzM4gjYjZWYxQzM0gTYhFDZjZDNfdWbp9CXt92Yu4GZjlGbh5SZslmZxl3Lc9CX6MHc0RHaiojIsJye.png)
他們都是在程式編譯或者部署時,判斷此資源檔案是否要同步用的。
Do not copy
不做資料同步
Copy always
每次都會被同步過去
Copy if newer
當有新版本存在時,才會被同步過去
Build Action 屬性則複雜多了, 下面是VS2010中, Silverlight 4 項目資源檔案的Build Action 屬性截圖。
注意,上面羅列了一些不适合資源檔案的 Build Action 屬性,在使用資源檔案時,可以忽略這些。
None
資源既不會被內建到程式集内,也不會打包到xap包中。不過我們可以通過設定CopyToOutputDirectory選項讓其自動拷貝到xap包所在目錄。
這種情況下,通路這個圖檔的相對Uri需要以"/"開始。
适用場景:
在大多數情況下,我們希望把video/audio檔案放到xap的外面,因為這種檔案一般都比較大,會影響silverlight應用的加載,而且一般的視訊音頻檔案都是壓縮格式的,放到xap中也不會起到減少他們檔案大小的作用。
類似圖檔視訊這種資源檔案生成操作為None時和他們沒有被添加到項目裡是一樣的,都可以用絕對Uri進行引用。
Compile
不适合用于資源檔案。
類檔案要用"Compile"生成操作,就是指項目裡.cs或.vb檔案。
Content
資源會被打包在Xap包裡面。
在這種方式下,如果沒有在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="silverlight.png"/>
或是<Image Source="./silverlight.png"/>,
在子檔案夾裡的可以用
<Image Source=”./images/sl.jpg”/>通路到。
最保險的方式是采用特有的程式集資源URI通路,格式為
<Image Source="/{assemblyShortName};component/Foo.jpg"/>,
這種方式還可以引用到xap中的其他程式集中的圖檔。
這種生成方式的系統資源可以直接用Application.GetResourceStream(uri).Stream在代碼裡來得到。
SplashScreen
"SplashScreen"是這個選項是WPF的啟動畫面使用的。 silverlight啟動加載畫面是用的其他方式實作的,是以在silverlight裡不要用這個方式。
EntityDeploy
這個是EntityFramework采用的生成方式,在silverlight裡是沒用。
參考資料:
分析silverlight裡的URI引用資源檔案的各種情況
<a href="http://bbs.blueidea.com/viewthread.php?tid=2941697">http://bbs.blueidea.com/viewthread.php?tid=2941697</a>
Silverlight圖檔相對路徑的設定
<a href="http://www.cnblogs.com/yangfan/archive/2009/12/14/1623647.html">http://www.cnblogs.com/yangfan/archive/2009/12/14/1623647.html</a>
關于Silverlight資源檔案(如:圖檔)的放置位置及其引用(相對路徑)
<a href="http://www.cnblogs.com/star250/archive/2009/10/15/1583665.html">http://www.cnblogs.com/star250/archive/2009/10/15/1583665.html</a>
Silverlight資源檔案
<a href="http://msdn.microsoft.com/zh-cn/library/cc296240(VS.95).aspx">http://msdn.microsoft.com/zh-cn/library/cc296240(VS.95).aspx</a>
圖檔等資源的引用路徑問題
<a href="http://www.cnblogs.com/kevinyang/archive/2008/11/16/1334712.html">http://www.cnblogs.com/kevinyang/archive/2008/11/16/1334712.html</a>