Silverlight圖片相對路徑的設置

這個問題也困擾了我很久.經常在Project裏包含一些圖片,然後在應用裏指定路徑,結果就是Load不上,遇到ImageError的錯誤。

 

這裏列出一些常用的設置Image 相對路徑的幾種方法:

假設我有這樣一個solution,包括: MyImageLibrary,其中包含一個文件夾"Images\MyImage1.png"; MyLoadImage是我的Silverlight Application裏面也有一個Images\MyImage2.png, 頁面中有一Image控件來分別顯示這兩個圖片

 

那麼有如下幾種選擇:

  1. Build Action="Resource", Copy To OutPut Directory = "Do not copy".

 

這時如果需要用另一個項目中的Image,那麼需要這樣設置Image路徑

xaml: <Image Source="/MyImageLibrary;component/Images/MyImage1.png" />

code: myImage.Source = new BitmapImage(new Uri("/MyImageLibrary;component/Images/MyImage1.png", UriKind.Relative));

這個Uri有如下3部分:

  • /MyImageLibrary 是Image所在的Assembly的名字,前面的"/"是必須的。
  • ";component/"是Assembly名字和在此Assembly下具體路徑之間的分隔符,必須要有。
  • "Images/MyImage1.png" 就是所在Assembly中的路徑啦。

此時圖片是作爲資源被嵌入進Assembly的. 如果用Reflector 打開MyImageLibrary.dll,就能夠找到這個資源:

這是Image在另一個assembly的時候的用法,如果在同一個項目下,那就可以直接這樣用:

<Image Source="Images/MyImage2.png"/>

2. Build Action = "Content", Copy To OutPut Directory = "Do not copy".

這種情況,如果圖片在另一個Project中,那是沒有辦法獲得的。只有在同一個Project中的時候,才能夠被找到,因爲這種設置會把Image嵌入.xap中.如果打開生成的xap,會看到如下

:

可以看到只有同一個Project中的Image作爲Content嵌入到xap中。

這時的用法就是

<Image Source="Images/MyImage2.png"/>

3.Build Action = "None", Copy To OutPut Directory = "Copy Always".

如果不希望圖片被壓進Xap文件,而是用戶調用的時候再動態Load,那可以用這種方法。這種方法圖片會被複制到 xap所在路徑下,路徑依然是 Images\MyImage1.png, Images\MyImage2.png.

使用方法如前<Image Source="Images/MyImage1.png" /> 或<Image Source="Images/MyImage2.png"/>

遇到圖片加載錯誤時,應該先檢查選用的是那種方法,然後再檢查圖片是否被正確放在所期望的地方,dll/xap/路徑 中。

其他常見的原因還包括:用絕對路徑的時候要注意是否是Cross-scheme, 比如如果你的項目要從加載位於 http://www.mydomain.com/Myimage.png的圖片,但是如果你Debug是在瀏覽器中打開的是file://C:/MyProject/..那就屬於是cross-scheme (File vs. Http),這時會有Security錯誤產生,解決方法就是用一個ASP.net website 作爲起始工程,然後加入Silverlight 工程。

本文來自Xun的博客,原文地址:http://blogs.msdn.com/b/xusun/archive/2008/12/31/silverlight.aspx

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章