天天看點

一起談.NET技術,Silverlight 資源的使用

我們在Silverlight 項目中,新加一個檔案,比如一個圖檔檔案,這個檔案的屬性會有下面2個選項,這兩個選項決定了這個圖檔資源如何存儲,如何使用。

先說簡單的,資源檔案的 Copy to OutPut Directory 屬性, 這個屬性有如下三個選項:

一起談.NET技術,Silverlight 資源的使用

他們都是在程式編譯或者部署時,判斷此資源檔案是否要同步用的。

Do not copy

不做資料同步

Copy always

每次都會被同步過去

Copy if newer

當有新版本存在時,才會被同步過去

Build Action 屬性則複雜多了, 下面是VS2010中, Silverlight 4 項目資源檔案的Build Action 屬性截圖。

一起談.NET技術,Silverlight 資源的使用

注意,上面羅列了一些不适合資源檔案的 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>

繼續閱讀