Copy to OutPut Directory
先說簡單的,資源檔案的 Copy to OutPut Directory 屬性, 這個屬性有如下三個選項:
Action | 說明 | 備注 |
Do not copy | 不做資料同步 | |
Copy always | 每次都會被同步過去 | |
Copy if newer | 當有新版本存在時,才會被同步過去 |
Build Action
Build Action 屬性則複雜多了, 下面是VS2010中, Silverlight 4 項目資源檔案的Build Action 屬性截圖:
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiYWan5COCNXS2ITMxMzMwIzMx8FMvw1MvwVMxETMwIzLcRnbl1GajFGd0F2LcRXZu5ibkN3YukGavw1LcpDc0RHaiojIsJye.gif)
Action | 說明 |
None | 資源既不會被內建到程式集内,也不會打包到xap包中。不過我們可以通過設定CopyToOutputDirectory選項讓其自動拷貝到xap包所在目錄。 這種情況下, 通路這個圖檔的相對Uri需要以"/"開始。 适用場景:在大多數情況下,我們希望把video/audio檔案放到xap的外面,因為這種檔案一般都比較大,會影響silverlight應用的加載,而且一般的視訊音頻檔案都是壓縮格式的,放到xap中也不會起到減少他們檔案大小的作用。 類似圖檔視訊這種資源檔案生成操作為None時和他們沒有被添加到項目裡是一樣的,都可以用絕對Uri進行引用。 |
Compile | 不适合用于資源檔案。類檔案要用"Compile"生成操作, 就是指項目裡.cs或.vb檔案。 |
Content | 資源會被打包在Xap包裡面。這種情況下, 通路這個圖檔的相對Uri需要以"/"開始。在這種方式下,如果沒有在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="sl.png" />或是<Image Source="./sl.png" />, 在子檔案夾裡的可以用<Image Source=”./images/ sl.png” />通路到。最保險的方式是采用特有的程式集資源URI通路,格式為 <Image Source="/{assemblyShortName};component/ sl.png "/>,這種方式還可以引用到xap中的其他程式集中的圖檔。這種生成方式的系統資源可以直接用Application.GetResourceStream(uri).Stream在代碼裡來得到。 |
SplashScreen | "SplashScreen"是這個選項是WPF的啟動畫面使用的。Silverlight啟動加載畫面是用的其他方式實作的,是以在Silverlight裡不要用這個方式。 |
EntityDeploy | 這個是EntityFramework采用的生成方式,在Silverlight裡是沒用。 |