標籤:圖片替換 api 圖片刪除 res 刪除 選擇 toolbar 目錄 resource
原文:WPF備忘錄(7)WPF圖片資源路徑介紹
在項目中增加兩張圖片Content.jpg和Resource.jpg,分別將其產生操作屬性設定為Content和Resource。
在介面中增加兩個Image控制項ImgContent和ImgResource,在XAML中分別設定Source路徑為Content.jpg和Resource.jpg。運行後ImgResource能正常顯示圖片,但是ImgContent控制項無顯示。將Content.jpg圖片拷貝至應用程式的Debug目錄中,ImgContent控制項可顯示圖片。
產生操作設定為Resource,產生的時候資源將添加到程式集中。可以嘗試將原有的圖片刪除,圖片正常顯示。將原有圖片用新圖片替換,仍顯示原有圖片。只有選擇重建操作才能更新圖片。
產生操作設定為Content,並不會添加至程式集,而且只有把資源放置在程式運行目錄才能訪問到資源。程式運行目錄調試時是Debug目錄,安裝後就是程式的安裝目錄。與直接把資源放置在程式運行目錄不同的是,添加Content資源檔,會向程式集(AssemblyAssociatedContentFile)中添加一個定製特性,該程式集記錄檔案是否存在及其相對位置。我發現VS2008有一個小Bug,在解決方案管理器中將Content.jpg改名為Con.jpg,Bug目錄下的圖片也做相應的改變。此時編譯器報錯:檔案Con.jpg不是項目的一部分或其“Build Action”屬性未設定為“Resource”。但是按F5運行,產生成功並正常顯示。可見在改變Content資源的時候,程式集中的定製特性沒有做相應的變化。
刪除XAML中的Source屬性,在後台為兩個圖片控制項設定Source屬性。有如下三種方式。
第一種
imgContent.Source = new BitmapImage(new Uri("Content.jpg", UriKind.Relative));
imgResource.Source = new BitmapImage(new Uri("Resource.jpg", UriKind.Relative)); 第二種
imgContent.Source = new BitmapImage(new Uri("pack://application:,,,/Content.jpg"));
imgResource.Source = new BitmapImage(new Uri("pack://application:,,,/Resource.jpg"));
第三種
imgContent.Source = new BitmapImage(new Uri("pack://SiteOfOrigin:,,,/Content.jpg"));
第一種和第二種都可以訪問相對路徑的Resource和Content資源。第三種方式可以訪問網站運行目錄下的Content資源檔以及完全鬆散的檔案。完全鬆散的檔案指那些沒有添加到項目中,只是拷貝在程式目錄中的檔案。應用程式根本不知道它的存在。
pack://application:,,,/Content.jpg表示當前項目的資源。它是pack://application:,,,/DllName;Component/Content.jpg的簡寫。將DllName替換成其他程式集,就可以訪問其他程式集的資源。
pack://SiteOfOrigin:,,,/Content.jpg表示從部署位置訪問檔案。
pack URI格式是XML檔案規格的一部分,具體格式如下 pack://packageURI/partPath。PackageURI實際上是在URI中放一個URI,它是把反斜線都變成了逗號。packageURI可以志向一個XPS文檔,例如file : /// c: /Document . xps會被編碼為file:...c:,Document.xps。在WPF程式中有兩種URI系統是特別處理的:
siteOfOrigin:/// 編碼後siteOfOrigin:,,,
application:/// 編碼後application:,,,
3個逗號其實是反斜線編碼過來的。
WPF備忘錄(7)WPF圖片資源路徑介紹