文章出處

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


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()