WPF、Silverlight程式編碼資料收集

來源:互聯網
上載者:User

一.擷取路徑資訊

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裡不要用這個方式 。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.