1. 程式人生 > >WPF後臺給Image新增路徑

WPF後臺給Image新增路徑

在專案中增加兩張圖片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個逗號其實是反斜槓編碼過來的。