天天看點

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表示從部署位置通路檔案。

     siteOfOrigin:/// 編碼後siteOfOrigin:,,,

     application:///   編碼後application:,,,

  3個逗号其實是反斜杠編碼過來的。