在WPF中顯示一張圖片,本是一件再簡單不過的事情。一張圖片,一行XAML代碼便可。ide
可是前段時間遇到了一件奇怪的事:測試
開發機上運行正常的程序,在某些客戶機器上卻顯示不了圖片,並且除了這個問題,其它運行狀況都正常。開始排查問題吧,先檢查代碼,而後檢查編譯打包過程,並無發現任何問題。再而後去客戶機器上測試,對應路徑下的圖片是否存在,是否圖片所在路徑的讀寫有問題,仍是沒有發現問題。最後發現,當程序移到其它路徑的時候,就一切正常了。而出現錯誤的路徑是:D:\\C#\\ 。這就是今天想說的問題,某些特殊符號(或叫保留字符)對圖片顯示的影響。code
首先簡單回顧一下WPF中顯示圖片經常使用的兩種圖片資源存儲方式:資源 和 內容。資源會被編譯到exe或dll中,使用優點是速度,簡便。而內容是與exe或dll有顯式關聯的獨立文件,他的使用優點是靈活。簡單介紹這麼幾句,相信你們都已經很瞭解了。而個人項目由於常常須要用戶本身替換圖片資源文件,因此選擇了「內容」的方式。orm
在WPF中,無論是資源仍是內容的方式,都是經過URI (uniform resource identifier)來標識和加載文件的。你們能夠在這裏對URI的構造和解析原理作更多的瞭解:MSDN WPF 中的 Pack URI。而Pack URI 方案由OPC (Open Packaging Conventions)規範使用,該規範利用了RFC 2396的擴展性來定義Pack URI方案。也就是說咱們定義的URI必須符合RFC 2396的規定。blog
Pack URI 的受權組件是一個嵌入式 URI,它指向程序包而且必須符合 RFC 2396。 另外,必須用字符「,」替換字符「/」,而且必須對保留字符(如「%」和「?」)進行轉義。 有關詳細信息,請參見 OPC。
那我們就來看看這個RFC 2396 中到底對URI作了哪些規定和限制:圖片
先來看一下保留字符:reserved = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" | "$" | "," 。顧名思義,這些字符是預留給系統使用的,咱們本身的資源URI裏不能包含。資源
再看看哪些字符是被排除的:excluded = "<" | ">" | "#" | "%" | <"> 。這些字符是不容許出現的,來看看RFC 2396中對這幾個字符被排除的解釋吧:開發
The angle-bracket "<" and ">" and double-quote (") characters are excluded because they are often used as the delimiters
around URI in text documents and protocol fields. The character "#" is excluded because it is used to delimit a URI from a fragment identifier in URI references (Section 4). The percent character "%" is excluded because it is used for the encoding of escaped characters.
看到這裏就很明顯了,咱們的圖片由於項目路徑的關係,包含了「#」符號,而圖片又使用了內容的方式,致使URI解析失敗,圖片沒有顯示。get
雖然咱們本身只寫了一行XAML代碼去實現圖片顯示,可是WPF的Pack URI作了資源分類,解析和文件加載等。it
好了,到此爲止就已經很明確的知道了致使錯誤的緣由了,可是暫時還沒想到解決辦法,只能告訴用戶去規範目錄命名,若是哪位有解決辦法,歡迎回復賜教,感謝!