一開始看到WPF里面經常用如下語句來構造資源文件Uri:
Uri uri = new Uri("/AssemblyName;component/image.png");
我還以為這種格式的字符串是URI標准規定的,但是網上查了一下卻沒發現有這種格式的URI字符串。
URI是統一資源標識符,通用文法為:
協議名(http,https,ftp,file等)+冒號+協議所對應的內容
URI又分為URL和URN,URL是用來定義一個資源的訪問路徑.而URN則是用來定義一個資源的名稱。(http://zh.wikipedia.org/zh/統一資源標志符)
仔細看了一下MSDN,才發現上面格式的字符串是微軟件自己擴展出來的一種URI格式,即Pack URI.這種URI在WPF里用得非常多,主要用來定位
資源文件,以及Xaml文件等。
Pack URI主要是用於描述一個Package中所包含的組成單元。
1. Pack URI的主要文法
pack://authority/path
其中authority指這里所指的Package的類型,而path主要指這里所指的組成單元在Package中路徑。
WPF所支持的authority包括:application:/// 和 siteoforigin:/// :
前者主要用來描述在編繹時就已知的資源(比如:資源文件等被Project所引用的文件在編繹時刻均已知),
而后者主要用來描述在編繹時無法確定其狀態的外部資源(比如:硬盤上的某個文件,或者網格上的某個文件)。
注意:在實際構建Pack URI的時需要將authority中所包含的"/"換成",". 因此 application:/// 應該為 application:,,,,siteoforigin:///類推。
2. Pack URI的用法
(1)表示當前Assembly中所引用的資源時,采用如下格式構建Pack URI
pack://application:,,,/(資源相對於Assembly所在目錄的相對路徑)
(2)表示當前Assemby所引用的其它Assembly所引用的資源時,采用如下格式構建Pack URI
pack://application:,,,/AssemblyShortName[;Version][;PublicKey];component/(資源相對於Assembly所在目錄的相對路徑)
(3)表示siteoforigin類型的資源時,采用如下格式構建Pack URI
pack://siteoforigin:,,,/(資源相對於當前執行的assembly所在位置的路徑)
3. Absolute pack URI and relative pack URI
以上所說的都是Absolute pack URI,格式包含schema://authority/path.字符串比較長,寫起來不是很方便。
因此還有一種簡化版的relative pack URI,構造時只需要使用path即可。
注意:當表示當前Assembly中所引用的資源時,path需表示目標資源相對於當前路徑的相對路徑。在路徑前加"/"表示相對於Assembly的根目錄