1. 程式人生 > >【C#】wpf中的xmlns名稱空間為什麼是一個網址,代表了什麼意思

【C#】wpf中的xmlns名稱空間為什麼是一個網址,代表了什麼意思

新建一個wpf的專案,我們先來看下它預設的名稱空間都是哪些?


可以看到xmlns有的是網址,有的是clr-namespace開頭的一串字母。clr開頭的比較好理解,就是執行時的名稱空間,就像C#程式碼中的using xxxx之類的一樣。

但是對於網址開頭的名稱空間有可能就有點疑惑了,它究竟代表的是什麼?xaml檔案被解析的時候會訪問這個網址嗎?如果這個網址那天不能get了,那我們的程式是不是就不能正常運行了。

在這裡我先把結論告訴大家,然後在一步步分析是為什麼。

結論:

以xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation這個為例,其實它就是System.Windows,System.Windows.Automation,System.Winjdows.Controls....等一系列名稱空間的集合,是這個集合的【別名】,在瀏覽器輸入這個網址有時候是不可訪問的。如果自己定義類庫的話,我把這個【別名】叫做張三也是可以的。微軟建議,這個一般定義為公司網址,或者個人網址。

分析:

我們一步步來看看,為什麼我們新增一個引用後,xmlns那裡能夠自動進行提示相應的網址。

1.用.NetReflector反編譯WindowsBase.dll,可以看到:


那個http開頭的名稱空間,與N個傳統的名稱空間做了對映。

2.自定義一個類庫也採用網址名稱空間的這種方式。

新建一個wpf類庫專案,名為WpfLibrary。更改其AssemblyInfo.cs檔案,增加這麼一行:

[assembly: XmlnsDefinition("www.wangzhi.com", "WpfLibrary")]
注意新增using System.Windows.Markup;

新增後的就是這樣子:



3.新建一個Wpf Application專案,在引用裡新增第二步中生成的dll檔案。

在新增名稱空間的時候,我們可以看到自動提示:


4.再嘗試另一種方式的名稱空間

我們將新增的那句assemlby:xmlnsdefinition(.......)去掉,然後重新生成類庫,在重新新增引用。那麼這次智慧提示裡肯定沒有www.wangzhi.com這個名稱空間了。有的是這個:


5.由此可見,網址形式的名稱空間等價於傳統形式的名稱空間,而且還可以是1對N的關係。網址形式的寫一行,抵得上傳統形式的N多行,節約手工程式碼量。