一.擷取路徑資訊
1. System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName
擷取模組的完整路徑。
2. System.Environment.CurrentDirectory
擷取和設定目前的目錄(該進程從中啟動的目錄)的完全限定目錄。
3. System.IO.Directory.GetCurrentDirectory()
擷取應用程式的當前工作目錄。這個不一定是程式從中啟動的目錄啊,有可能程式放在C:\\www裡,這個函數有可能返回C:\\Documents and Settings\\ZYB\\,或者C:\\Program Files\\Adobe\\,有時不一定返回什麼東東,我也搞不懂了。
4. System.AppDomain.CurrentDomain.BaseDirectory
擷取程式的基目錄。
5. System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase
擷取和設定包括該應用程式的目錄的名稱。
6. System.Windows.Forms.Application.StartupPath
擷取啟動了應用程式的可執行檔的路徑。效果和2、5一樣。只是5返回的字串後面多了一個"\\"而已
7. System.Windows.Forms.Application.ExecutablePath
擷取啟動了應用程式的可執行檔的路徑及檔案名稱,效果和1一樣。
8. 在WPF中是無法使用myCollection["System_CurDirectory"] = Application.StartupPath;來擷取當前程
序路徑的,應該這樣用:myCollection["System_CurDirectory"] = System.IO.Path.GetDirectoryName (Process.GetCurrentProcess().MainModule.FileName);
二、擷取SilverLight.Web項目中路徑Uri
URI 是 Intranet 或 Internet 上可由應用程式使用的資源的一種簡潔表示形式。Uri 類定義了屬性和方法來處理 URI,包括分析、比較和組合。
Uri 類屬性是唯讀;若要建立可修改的對象,請使用 UriBuilder 類。
相對 URI(例如"/new/index.htm")必須相對於基 URI 展開,這樣才是絕對的。提供了 MakeRelativeUri 方法,以便在必要時將絕對 URI 轉換為相對 URI。
如果 URI 字串是格式良好的 URI 並且包括方案標識符,Uri 建構函式將不會轉義 URI 字串。
Uri 屬性用轉義編碼返回正常化資料表示形式,任何 Unicode 值大於 127 的字元都會被替換為等效的十六進位數。為使 URI 具有正常化格式,Uri 建構函式執行以下步驟:
將 URI 方案轉換為小寫。
將主機名稱轉換為小寫。
如果主機名稱為 IPv6 地址,則使用正常化 IPv6 地址。ScopeId 和其他可選的 IPv6 資料將被移除。
移除預設連接埠號碼和空連接埠號碼。
通過壓縮 /./、/../、// 等序列(包括轉義表示形式),正常化分層 URI 的路徑。請注意,在某些方案中,不壓縮轉義表示形式。
對於分層 URI,如果主機未以正斜杠 (/) 結尾,則添加一個正斜杠。
URI 中的任何保留字元都要根據 RFC 3986 進行轉義。
在某些方案的建構函式中,作為正常化工作的一部分,將壓縮轉義表示形式。其 URI 將壓縮逸出序列的方案包括:file、http、https、net.pipe 和 net.tcp。對於其他所有方案,不壓縮逸出序列。例如:如果您將兩個點".."編碼為百分比符號形式的"%2E%2E",則對於某些方案,URI 建構函式將壓縮此序列。例如,下面的程式碼範例示範了 http 方案的 URI 建構函式。
代碼
方法一:
//擷取指定要呈現的xaml內容的包活xaml檔案Uri
var strFullUrl = Application.Current.Host.Source.AbsoluteUri;
if (strFullUrl.IndexOf("ClientBin") > 0)
{
var uristr = strFullUrl.Substring(0, strFullUrl.IndexOf("ClientBin")) + "Report/Default.aspx";
var uri = new Uri(uristr);
}
方法二:
var uri = new Uri(App.Current.Host.Source, "../Report/Default.aspx");
方法三:
string url = System.Windows.Browser.HtmlPage.Document.DocumentUri.ToString();
var struri = url.Substring(0, url.LastIndexOf("/")) + "/Report/Default.aspx";
var uri = new Uri(struri);
方法四:
擷取網頁根目錄
var xapUri = Application.Current.Host.Source;
var uri = new Uri(xapUri, "../");
三、Silverlight裡的URI引用資源檔的各種情況
主要介紹一下在silverlight裡的資源檔(圖片, 視頻, 字型之類)設定不同的Build Action時在XAML或是後台C#裡如何引用的問題.
就拿圖片檔案作例子來介紹各種Build Action的情況(選中一個檔案後按F4開啟vs屬性面板就可以看到Build Action選項, 並可以更改)
假如我們有兩個圖片檔案分別叫silverlight.png和sl.jpg, 把silverlight.png添加到應用的根目錄裡, 和我們的MainPage.xaml檔案在一個檔案夾, sl.jpg放到一個建立的images檔案夾裡
1. Resource:
選擇這種產生方式後,該資源檔會被嵌入到該應用的程式集中,就是說開啟產生的xap是看不到這個檔案的.
可以用相對於當前的XAML檔案的相對Uri訪問, 如<Image Source="silverlight.png" />或是<Image Source="./silverlight.png" />, 在子檔案夾裡的可以用<Image Source=”./images/sl.jpg” />訪問到
最保險的方式是採用特有的程式集資源URI訪問,格式為
<Image Source="/{assemblyShortName};component/Foo.jpg"/>, 這種方式還可以引用到xap中的其他程式集中的圖片
修改我們的兩個圖片的引用方式為
代碼:
<Image Source="/SilverlightApplication1;component/silverlight.png"/>
<Image Source="/SilverlightApplication1;component/images/sl.jpg" Height="100"/>
你可以發現一樣可以正常顯示
如果沒找到檔案的話,系統不會再找別的位置了, 會觸發ImageFailed事件
在Build Action為Resource時, 可以用一下幾種相對URI來引用資源檔
代碼:
<Image Source="/SilverlightApplication1;component/silverlight.png" Height="100"/>
<Image Source="./silverlight.PNG" Height="100" />
<Image Source="silverlight.PNG" Height="100" />
<Image Source="/SilverlightApplication1;component/images/sl.jpg" Height="100"/>
<Image Source="./images/sl.jpg" Height="100" />
注意這種產生方式的系統資源可以直接用Application.GetResourceStream(uri).Stream在代碼裡來得到
2. Content:
用這種方式產生XAP後檔案會被添加到xap檔案中,用壓縮公用程式開啟我們產生的xap後可以看到我們的圖片檔案,silverlight.png在應用的"根"目錄, 而sl.jpg檔案存放在images檔案夾中
這種情況下, 訪問這兩個圖片的相對Uri需要以"/"開始
代碼:
<Image Source="/silverlight.PNG" Height="100" />
<Image Source="/images/sl.jpg" Height="100" />
注意在這種方式下, 如果沒有在xap中找到圖片檔案, 那麼silverlight會自動從當前xap應用所在的檔案夾下來找所需圖片檔案,如果還沒有找到那麼就觸發ImageFailed事件, 這種方式比較適合在多個程式集引用相同檔案時採用
3. None:
None表示不作產生處理, 我們的圖片檔案不會被拷貝到XAP檔案中,需要考慮的是"CopyToOutputDirectory"這個選項, 這個選項有三個選擇"Do not copy","Copy always","Copy if newer", 因為我們需要引用圖片檔案, 我們可以選擇後兩個中的一個,這樣在項目編譯後,可以看到在xap的所在檔案裡會有一個silverlight.png檔案和一個images檔案夾, sl.jpg檔案就在images檔案夾裡
引用檔案的Uri方式同第二種Content方式
在大多數情況下, 我們希望把video/audio檔案放到xap的外面,因為這種檔案一般都比較大, 會影響silverlight應用的載入, 而且一般的視頻音頻檔案都是壓縮格式的,放到xap中也不會起到減少他們檔案大小的作用.
類似圖片視頻這種資源檔產生操作為None時和他們沒有被添加到項目裡是一樣的, 都可以用絕對Uri進行引用
小結:
相對Uri引用:[/i]
代碼:<Image Source="/silverlight.PNG" Height="100" />
<Image Source="/images/sl.jpg" Height="100" />
[i]絕對路徑引用:
代碼:
<Image Source="http://localhost:50235/clientbin/silverlight.PNG" Height="100" />
<Image Source="http://localhost:50235/clientbin/images/sl.jpg" Height="100" />
4. EmbeddedResource:
這種方式會把檔案嵌入到程式集中, silverlight無法通過Uri引用在xaml和c#裡對這個檔案進行使用, 微軟不建議在silverlight採用這種方式在程式集裡嵌入資源.
如果有這種需求可以用
Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream(string path)相關的方法得到檔案的stream引用
我建議直接改為第一種的"Resource"方式, 然後採用第一種的引用方式就可以了
關於Resource方式和EmbeddedResource的不同我不多介紹了, 如果感興趣的話可以用reflector工具開啟你的程式集dll檔案, 在Resources目錄下可以看到兩者的不同之處, 用Resource內嵌資源會被系統放到AppName.g.resources中,而採用EmbeddedResource方式的資源會被直接放到Resources目錄下,其他的細節就不介紹了.
Page:
所有的使用者控制項, 頁面和子表單(usercontrol/page/childwindow)的xaml檔案應該採用的產生操作, 如果改為別的方式那麼會導致後台對應的代碼檔案無法連結到這個xaml檔案, 採用"Page" build action時xaml裡的錯誤會導致工程無法正確產生.
Compile
類檔案要用"Compile"產生操作, 就是指項目裡.cs或.vb檔案
ApplicationDefinition
silverlight程式的入口xaml檔案(預設就是App.xaml)應該設定為這個"應用定義"
Entity Deploy
這個是EntityFramework採用的產生方式, 在silverlight裡是沒用
SplashScreen
"SplashScreen"是這個選項是WPF的啟動畫面使用的, silverlight啟動載入畫面是用的其他方式實現的, 所以在silverlight裡不要用這個方式 。
主要介紹一下在silverlight裡的資源檔(圖片, 視頻, 字型之類)設定不同的Build Action時在XAML或是後台C#裡如何引用的問題.
就拿圖片檔案作例子來介紹各種Build Action的情況(選中一個檔案後按F4開啟vs屬性面板就可以看到Build Action選項, 並可以更改)
假如我們有兩個圖片檔案分別叫silverlight.png和sl.jpg, 把silverlight.png添加到應用的根目錄裡, 和我們的MainPage.xaml檔案在一個檔案夾, sl.jpg放到一個建立的images檔案夾裡
1. Resource:
選擇這種產生方式後,該資源檔會被嵌入到該應用的程式集中,就是說開啟產生的xap是看不到這個檔案的.
可以用相對於當前的XAML檔案的相對Uri訪問, 如<Image Source="silverlight.png" />或是<Image Source="./silverlight.png" />, 在子檔案夾裡的可以用<Image Source=”./images/sl.jpg” />訪問到
最保險的方式是採用特有的程式集資源URI訪問,格式為
<Image Source="/{assemblyShortName};component/Foo.jpg"/>, 這種方式還可以引用到xap中的其他程式集中的圖片
修改我們的兩個圖片的引用方式為
代碼:
<Image Source="/SilverlightApplication1;component/silverlight.png"/>
<Image Source="/SilverlightApplication1;component/images/sl.jpg" Height="100"/>
你可以發現一樣可以正常顯示
如果沒找到檔案的話,系統不會再找別的位置了, 會觸發ImageFailed事件
在Build Action為Resource時, 可以用一下幾種相對URI來引用資源檔
代碼:
<Image Source="/SilverlightApplication1;component/silverlight.png" Height="100"/>
<Image Source="./silverlight.PNG" Height="100" />
<Image Source="silverlight.PNG" Height="100" />
<Image Source="/SilverlightApplication1;component/images/sl.jpg" Height="100"/>
<Image Source="./images/sl.jpg" Height="100" />
注意這種產生方式的系統資源可以直接用Application.GetResourceStream(uri).Stream在代碼裡來得到
2. Content:
用這種方式產生XAP後檔案會被添加到xap檔案中,用壓縮公用程式開啟我們產生的xap後可以看到我們的圖片檔案,silverlight.png在應用的"根"目錄, 而sl.jpg檔案存放在images檔案夾中
這種情況下, 訪問這兩個圖片的相對Uri需要以"/"開始
代碼:
<Image Source="/silverlight.PNG" Height="100" />
<Image Source="/images/sl.jpg" Height="100" />
注意在這種方式下, 如果沒有在xap中找到圖片檔案, 那麼silverlight會自動從當前xap應用所在的檔案夾下來找所需圖片檔案,如果還沒有找到那麼就觸發ImageFailed事件, 這種方式比較適合在多個程式集引用相同檔案時採用
3. None:
None表示不作產生處理, 我們的圖片檔案不會被拷貝到XAP檔案中,需要考慮的是"CopyToOutputDirectory"這個選項, 這個選項有三個選擇"Do not copy","Copy always","Copy if newer", 因為我們需要引用圖片檔案, 我們可以選擇後兩個中的一個,這樣在項目編譯後,可以看到在xap的所在檔案裡會有一個silverlight.png檔案和一個images檔案夾, sl.jpg檔案就在images檔案夾裡
引用檔案的Uri方式同第二種Content方式
在大多數情況下, 我們希望把video/audio檔案放到xap的外面,因為這種檔案一般都比較大, 會影響silverlight應用的載入, 而且一般的視頻音頻檔案都是壓縮格式的,放到xap中也不會起到減少他們檔案大小的作用.
類似圖片視頻這種資源檔產生操作為None時和他們沒有被添加到項目裡是一樣的, 都可以用絕對Uri進行引用
小結:
相對Uri引用:[/i]
代碼:<Image Source="/silverlight.PNG" Height="100" />
<Image Source="/images/sl.jpg" Height="100" />
[i]絕對路徑引用:
代碼:
<Image Source="http://localhost:50235/clientbin/silverlight.PNG" Height="100" />
<Image Source="http://localhost:50235/clientbin/images/sl.jpg" Height="100" />
4. EmbeddedResource:
這種方式會把檔案嵌入到程式集中, silverlight無法通過Uri引用在xaml和c#裡對這個檔案進行使用, 微軟不建議在silverlight採用這種方式在程式集裡嵌入資源.
如果有這種需求可以用
Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream(string path)相關的方法得到檔案的stream引用
我建議直接改為第一種的"Resource"方式, 然後採用第一種的引用方式就可以了
關於Resource方式和EmbeddedResource的不同我不多介紹了, 如果感興趣的話可以用reflector工具開啟你的程式集dll檔案, 在Resources目錄下可以看到兩者的不同之處, 用Resource內嵌資源會被系統放到AppName.g.resources中,而採用EmbeddedResource方式的資源會被直接放到Resources目錄下,其他的細節就不介紹了.
Page:
所有的使用者控制項, 頁面和子表單(usercontrol/page/childwindow)的xaml檔案應該採用的產生操作, 如果改為別的方式那麼會導致後台對應的代碼檔案無法連結到這個xaml檔案, 採用"Page" build action時xaml裡的錯誤會導致工程無法正確產生.
Compile
類檔案要用"Compile"產生操作, 就是指項目裡.cs或.vb檔案
ApplicationDefinition
silverlight程式的入口xaml檔案(預設就是App.xaml)應該設定為這個"應用定義"
Entity Deploy
這個是EntityFramework採用的產生方式, 在silverlight裡是沒用
SplashScreen
"SplashScreen"是這個選項是WPF的啟動畫面使用的, silverlight啟動載入畫面是用的其他方式實現的, 所以在silverlight裡不要用這個方式 。