Silverlight圖片路徑處理方式解析
Silverlight開(kāi)發(fā)工具對(duì)于圖片的處理是相當(dāng)強(qiáng)大的。我們可以通過(guò)這款工具創(chuàng)建出各種形態(tài)的圖片格式以滿足自己的需求。Silverlight圖片路徑中, 現(xiàn)在支持的Image格式有jpg和png,部分png編碼也不支持,同時(shí)有些png在xaml的design預(yù)覽中不可見(jiàn),但運(yùn)行時(shí)可見(jiàn)。請(qǐng)看XAML markup中兩行代碼的異同:#t#
- < StackPanel Background="White"
Orientation="Vertical"> - < Image x:Name="blue" Source=
"/images/blue.png" Stretch="None"/> - < Image x:Name="green" Source=
"images/green.png" Stretch="None" /> - < /StackPanel>
反斜杠forward-slash?有沒(méi)有蝦米區(qū)別呢?如圖所示,名稱(chēng)為Resource測(cè)試示例解決方案資源管理器以及運(yùn)行效果:以反斜杠開(kāi)頭的blue圖片需要放在ClientBin目錄下的相應(yīng)文件夾里;不以反斜杠開(kāi)頭的green圖片應(yīng)該放在Resource目錄下的相應(yīng)文件夾里。這樣才可正確引用,否則會(huì)發(fā)生ImageError。
為什么??jī)烧叨际荢ilverlight圖片路徑,到底反斜杠帶來(lái)了什么區(qū)別呢?反斜杠開(kāi)頭的相對(duì)路徑,代表的相對(duì)位置是應(yīng)用程序運(yùn)行的根目錄,即.xap壓縮包內(nèi),若在這其中尋找不到要引用的文件,則相對(duì)路徑的回退機(jī)制(fallback mechanism )自動(dòng)在在.xap所在的目錄,本例即為ClientBin目錄中尋找加以引用。兩個(gè)位置都沒(méi)有,才會(huì)發(fā)生錯(cuò)誤。不以"/"開(kāi)頭,則代表的相對(duì)位置是引用該圖片的XAML文件所在的目錄,本例即page.xaml文件所在的Resource目錄。
那么究竟選擇哪種Silverlight圖片路徑方式呢?把xap文件重命名為zip文件,解壓之,再用reflector反編譯其中的dll文件,發(fā)現(xiàn)其包含了green圖片,卻沒(méi)有blue圖片。其實(shí)也很明顯,blue所在的images文件夾與.xap同級(jí),自然不會(huì)包含在內(nèi)。由此可知,不以反斜杠開(kāi)頭的green圖片嵌入到Silverlight程序中的xap文件直接下載到客戶(hù)端,而blue圖片則按需索?。╫n-demand),當(dāng)顯示時(shí)再去下載。當(dāng)數(shù)據(jù)量較大時(shí),不以反斜杠開(kāi)頭的方式加載程序的時(shí)間就過(guò)長(zhǎng),用戶(hù)體驗(yàn)不好,以"/"開(kāi)頭自然就無(wú)此無(wú)慮,不過(guò)以反斜杠開(kāi)頭的話,在xaml中設(shè)計(jì)預(yù)覽看不到,只有程序運(yùn)行才可以看到。(若為了預(yù)覽,可先從ClienBin那里復(fù)制一份放在page.xaml同級(jí)目錄下供設(shè)計(jì)使用,程序發(fā)布時(shí)予以刪除。)
除了在XAML中直接確定Image的Source URI,當(dāng)然也可以在code-behind中確定,此時(shí)反斜杠的用法和XAML中相通。
- C#:Image img = new Image();
- img.Source = new BitmapImage(
new Uri("test.jpg", UriKind.
Relative)); //page.xaml所在目錄下- //img.Source = new BitmapImage
(new Uri("/test.jpg", UriKind.
Relative)); //.xap所在目錄下
話說(shuō)要是使用諸如http://www.liongg.net/test.jpg之類(lèi)絕對(duì)URI就沒(méi)反斜杠什么事了。在代碼中還可以利用Application.Current.Host.Source.AbsolutePath等方法,我試驗(yàn)下了,發(fā)覺(jué)太麻煩還沒(méi)意思,不再多管。
再深入一點(diǎn),甚至Silverlight圖片路徑放在與page.xaml同級(jí)的文件夾下,一樣可以使用反斜杠進(jìn)行引用。只需要在相應(yīng)圖片的屬性里,把Build Action選擇為"Content"即可,不過(guò)該圖片還是被放到.xap壓縮包里了