久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

Silverlight技術(shù)研討(2):圖片資源引用及動(dòng)態(tài)下載

 Jcstone 2013-05-18

Silverlight技術(shù)研討(2):圖片資源引用及動(dòng)態(tài)下載 (轉(zhuǎn))

silverlightweb服務(wù)stringoutputactionimage

上一節(jié)介紹了Silverlight資源文件動(dòng)態(tài)下載的必要性,,同時(shí)介紹了用于動(dòng)態(tài)下載的關(guān)鍵技術(shù)WebClient,。這一節(jié)將總結(jié)歸納Silverlight中圖片資源引用的幾種方法,,著重介紹動(dòng)態(tài)下載及緩存。還是考慮我們的應(yīng)用:MMORPG游戲,,都需要哪些資源呢,?主要有兩類,音頻文件和游戲圖片,。其實(shí)各類資源的引用方法大同小異,,這里僅以圖片資源為例,講述一下各種引用方法,。

 

1 圖片直接編譯到silverlight應(yīng)用程序的dll當(dāng)中

這也是缺省的方法,,具體做法是:在visual studio中,選擇一個(gè)圖片,,查看屬性窗口,。
Build Action: Resource (注意不要選擇Embeded Resource,Silverlight無(wú)法識(shí)別該格式,。)
Copy to output directory: Do not copy
 
于是在Xaml中可以這樣引用圖片
<Image Source="Images/grandpiano.jpg"></Image>

 

 
用C#引用:
img.Source = new BitmapImage(new Uri("Images/grandpiano.jpg", UriKind.Relative));

 

注意BitmapImage對(duì)象有個(gè)ImageOpened事件,,可以用來(lái)通知圖片已經(jīng)可用。
 
或者:
img.Source = new BitmapImage(new Uri("/SilverlightApplication1;component/Images/grandpiano.jpg", UriKind.Relative));

 

 
我們還可以選擇另外一個(gè)相對(duì)復(fù)雜一些的方法:
StreamResourceInfo sr = Application.GetResourceStream(
new Uri("/SilverlightApplication1;component/Images/grandpiano.jpg", UriKind.Relative));
BitmapImage bmp
= new BitmapImage();
bmp.SetSource(sr.Stream);
img.Source
= bmp,;

 

  
注意下面的用法是錯(cuò)誤的:
StreamResourceInfo sr = Application.GetResourceStream(
new Uri("Images/grandpiano.jpg", UriKind.Relative));
BitmapImage bmp
= new BitmapImage();
bmp.SetSource(sr.Stream);
img.Source
= bmp,;

 

運(yùn)行時(shí)會(huì)顯示錯(cuò)誤信息。
 

2 把圖片資源放到silverlight應(yīng)用程序的主包(Xap)中

具體做法是:在visual studio中,,選擇一個(gè)圖片,查看屬性窗口,。
Build Action: Content
Copy to output directory: Always copy 
這時(shí)候把xap文件改名為zip文件,,可以發(fā)現(xiàn)Images目錄下有g(shù)randpiano.jpg文件。說(shuō)明圖片在xap包中,,但是沒(méi)有編譯到dll中,。
 
在Xaml中可以這樣引用圖片 
Image Source="/Images/grandpiano.jpg"></Image>

 

注意跟前面的區(qū)別:最前面的“/”代表xap文件的根路徑。
 
用C#引用:
img.Source = new BitmapImage(new Uri("Images/grandpiano.jpg"));

 

 
或者:
StreamResourceInfo sr = Application.GetResourceStream(
new Uri("Images/grandpiano.jpg", UriKind.Relative));
BitmapImage bmp
= new BitmapImage();
bmp.SetSource(sr.Stream);
img.Source
= bmp,;

 

注意在C#引用中沒(méi)有最前面的“/”,。
 
總的來(lái)說(shuō),把文件放到主包中與編譯到dll中比較相像,。但都不是動(dòng)態(tài)下載,,因?yàn)閳D片都還在主包中,會(huì)跟主程序一同下載,。
 

3 把圖片放到web服務(wù)器上

為方便描述起見(jiàn),,假設(shè)圖片與silverlight應(yīng)用程序在同一個(gè)域,不存在跨域的問(wèn)題,。為了突出主題,,跨域訪問(wèn)的授權(quán)許可這里就不討論了,。另外假設(shè)圖片目錄與silverlight主包在同一個(gè)目錄。即
/ClientBin/
    App.Xap
    Images/
 
具體做法是:在visual studio中,,選擇一個(gè)圖片,,查看屬性窗口。
build action: None
Copy to output directory: Always copy 
 
在Xaml中可以這樣引用圖片
<Image Source="/Images/grandpiano.jpg"></Image>

 

 
用C#引用:
img.Source = new BitmapImage(new Uri("Images/grandpiano.jpg"));

 

 咦,,發(fā)現(xiàn)沒(méi)有,?這與方法2完全相同!沒(méi)錯(cuò),,Silverlight會(huì)首先檢查xap包,,如果沒(méi)有找到圖片,會(huì)再檢查web服務(wù)器,。也就是說(shuō),,相同的代碼,你可以在方法2和方法3中自由選擇和切換,,方便吧,?
 
方法3雖然與方法2代碼相同,本質(zhì)上已經(jīng)根本不同,。方法3中圖片文件已經(jīng)不在xap文件中,,而是在web服務(wù)器上,意味著xap文件的尺寸已經(jīng)大大減小,,silverlight應(yīng)用程序的加載時(shí)間大大縮小,。缺點(diǎn)是這些圖片因?yàn)闀?huì)在引用時(shí)動(dòng)態(tài)從服務(wù)器下載,直到下載完成才可使用,,所以會(huì)導(dǎo)致延遲,。不過(guò)由于Silverlight緩存資源的緣故,只有第一次引用會(huì)有延遲,,再次引用時(shí)將直接從緩存中讀取文件,,沒(méi)有絲毫延遲。
 
除此之外,,更加靈活和強(qiáng)大的方式是使用上節(jié)介紹的WebClient類的OpenReadAsync方法,。代碼如下:
string uri = Application.Current.Host.Source.AbsoluteUri;
int index = uri.IndexOf("/ClientBin");
uri
= uri.Substring(0, index) + "/Images/grandpiano.jpg";
// Begin the download.
WebClient webClient = new WebClient();
webClient.OpenReadCompleted
+= webClient_OpenReadCompleted;
webClient.OpenReadAsync(
new Uri(uri));

//
private void webClient_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)
{
if (e.Error != null)
{
// (Add code to display error or degrade gracefully.)
}
else
{
BitmapImage bitmapImage
= new BitmapImage();
bitmapImage.SetSource(e.Result);
img.Source
= bitmapImage;
}
}

 

前一節(jié)講過(guò)webClient與瀏覽器共享緩存,即webClient會(huì)把下載的文件保存到瀏覽器緩存目錄中,,如果文件已經(jīng)被緩存,,再次調(diào)用OpenReadAsync方法時(shí)將直接中緩存中獲得文件,這將大大減小獲取文件的時(shí)間,。但是從瀏覽器緩存獲取文件仍然會(huì)有一點(diǎn)點(diǎn)延遲,,通常不會(huì)被察覺(jué),但是如果用于顯示動(dòng)畫(huà),,這個(gè)延遲會(huì)導(dǎo)致嚴(yán)重閃爍,。解決這個(gè)問(wèn)題的辦法就是把下載的資源保存到silverlight的內(nèi)存中,,引用時(shí)直接從內(nèi)存讀取。Application.Resources是個(gè)不錯(cuò)的選擇,,可以用于資源緩存,。
 
 

4. 把圖片打包放到web服務(wù)器上

把圖片打包放置到web服務(wù)器上更便于圖片資源的管理和維護(hù),而且可以把圖片分類保存到不同的壓縮包里,。因?yàn)橄螺d圖片時(shí)通常是同類圖片一起下載,,下載一個(gè)包當(dāng)然比分開(kāi)下載許多圖片方便快捷許多。
 
具體方法是把圖片打包(zip)后,,放置到ClientBin目錄,。然后代碼如下:
01 <PRE class=brush:csharp>void DownloadImagePart(string imgPart)
02 {
03     WebClient wc = new WebClient();
04     wc.OpenReadCompleted += new OpenReadCompletedEventHandler(wc_OpenReadCompleted);
05     wc.OpenReadAsync(new Uri("imgs.zip", UriKind.Relative), imgPart);
06 }
07   
08 void wc_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)
09 {
10     StreamResourceInfo sri = new StreamResourceInfo(e.Result as Stream, null);
11     String sURI = e.UserState as String;
12     StreamResourceInfo imageStream = Application.GetResourceStream(sri, new Uri(sURI, UriKind.Relative));
13     BitmapSource imgsrc = new BitmapSource ();
14     imgsrc.SetSource(imageStream.Stream);
15     ImgToFill.Source = imgsrc;
16 }
17 </PRE>
 
 
 
至此圖片引用以及動(dòng)態(tài)下載和緩存的技術(shù)討論完畢了,應(yīng)該說(shuō)幾乎囊括了主要的引用方式,,大家可以根據(jù)具體情況選用其中的方法,。如果還有其他方法沒(méi)有收錄進(jìn)來(lái),歡迎大家補(bǔ)充,。為了方便大家學(xué)習(xí)和使用,,這里附有源碼,每個(gè)項(xiàng)目文件代表一種方法,。
 
后面文章將討論如何把該技術(shù)應(yīng)用到我們的MMORPG游戲中去,,實(shí)現(xiàn)圖片的動(dòng)態(tài)下載策略。謝謝支持,!
 
參考資料:

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn),。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多