XAML实例教程系列 - 命名空间(NameSpace) 三
XAML實(shí)例教程系列 - 命名空間(NameSpace)
2012-05-28 14:14 by jv9,?2205?閱讀,?10?評(píng)論,?收藏,?編輯
上一篇曾提及XAML中,每個(gè)對(duì)象元素的聲明是對(duì).NET類進(jìn)行一次實(shí)例化操作。XAML作為聲明類語言,如何識(shí)別對(duì)象元素,并如何在.NET Framework中找到對(duì)應(yīng)映射類呢?本篇將引入命名空間(NameSpace)的概念,涉及內(nèi)容如下:
XAML命名空間的概念和C#代碼中的Using,VB.Net代碼中的Import相似,其作用是為對(duì)象元素的實(shí)例化提供引用類庫聲明。
簡單的理解,當(dāng)在XAML頁面中需要調(diào)用某控件對(duì)象時(shí),需要提前對(duì)該控件對(duì)象的類庫進(jìn)行引用聲明,而定義XAML命名空間是類庫引用聲明的一種方法。
本篇將使用Visual Studio?11創(chuàng)建一個(gè)簡單的Silverlight 5項(xiàng)目,通過對(duì)比Windows 8和Silverlight項(xiàng)目的命名空間,幫助理解命名空間的使用。
項(xiàng)目名:XamlGuideSL
?
?
?
Visual Studio 11生成的Silverlight 5默認(rèn)命名空間代碼如下:
對(duì)比上一篇Windows 8實(shí)例的命名空間代碼:
?
通過比較以上兩個(gè)命名空間定義,我們可以發(fā)現(xiàn)Windows 8和Silverlight 5具有類似的命名空間,例如:
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc=http://schemas.openxmlformats.org/markup-compatibility/2006
在移植Silverlight項(xiàng)目到Windows 8平臺(tái)過程中,WinRT XAML可以兼容Silverlight XAML代碼,輕松實(shí)現(xiàn)應(yīng)用平臺(tái)移植。
NameSpace命名空間格式
在以上代碼中<UserControl>或<Page>作為頁面Root對(duì)象元素被聲明,其開始標(biāo)簽<UserControl>或<Page>中,包含了多個(gè)“xmlns”特性,在XAML語法規(guī)則中,“xmlns”是屬于強(qiáng)制關(guān)鍵字,被用來聲明一個(gè)命名空間。其語法結(jié)構(gòu)為“xmlns:”+“命名空間前綴名”,而對(duì)于默認(rèn)命名空間,無需定義命名空間前綴名。
?
? xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
以上四個(gè)命名空間是Visual Studio 11創(chuàng)建默認(rèn)項(xiàng)目時(shí)自動(dòng)生成的,其中分別映射了實(shí)例化一個(gè)Silverlight或Windows 8空白頁面所需要的公共類庫。
?
核心NameSpace命名空間
在以上四個(gè)命名空間中,“xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"”和“xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"”是一個(gè)XAML頁面的核心命名空間,
對(duì)于這兩個(gè)命名空間的詳細(xì)解釋如下:
- xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"是默認(rèn)命名空間,其中包含Silverlight或Windows 8核心類,提供兩者基礎(chǔ)應(yīng)用元素支持,作為核心類庫命名空間,無需定義命名空間前綴名,該命名空間默認(rèn)作用于整個(gè)頁面,從上述代碼中可以看出<UserControl>,<Page>都屬于該命名空間下的元素對(duì)象。作為默認(rèn)命名空間,直接映射多個(gè).Net Framework核心類庫,例如,System.Windows, System.Windows.UIElements, System.Windows.Controls 等類庫。
- xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"引用默認(rèn)XAML類庫,其中包含大量XAML語言通用功能類,其作用對(duì)頁面XAML提供基礎(chǔ)以及擴(kuò)展功能支持。這個(gè)命名空間使用“x”作為前綴名,表示在XAML頁面中可以使用“x:”引用該類庫。其常用語法結(jié)構(gòu)如下:<x:元素名 />。例如: <Grid x:Name=“LayoutRoot”/>
?一個(gè)完整的XAML頁面必須具備以上兩個(gè)命名空間,否則將無法正常實(shí)例化。
?
設(shè)計(jì)類NameSpace命名空間
在設(shè)計(jì)XAML頁面時(shí),Visual Studio和Expression Blend同樣需要XAML命名空間支持,幫助實(shí)現(xiàn)設(shè)計(jì)工具內(nèi)的視圖設(shè)計(jì)模式。所用到的默認(rèn)命名空間如下:- xmlns:d=http://schemas.microsoft.com/expression/blend/2008,該命名空間引用Expression Blend輔助設(shè)計(jì)類庫,對(duì)Visual Studio和Expression Blend視圖設(shè)計(jì)模式提供支持,其實(shí)際設(shè)計(jì)中主要提供設(shè)計(jì)視圖頁面尺寸定制。
- xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006",該命名空間引用XAML語言輔助類庫,對(duì)XAML提供輔助設(shè)計(jì)支持,主要功能是為XAML語法解析器提供輔助解釋功能,例如,使用mc:Ignorable=“d”告知XAML解析器以“xmlns:d”為前綴的元素引用在運(yùn)行時(shí)被忽略。從前文代碼中可以看到,xmlns:d命名空間前綴名,使用Expression Blend輔助設(shè)計(jì)類庫中的DesignHeight和DesignWidth,分別定義在設(shè)計(jì)工具下視圖模式中頁面顯示尺寸,d:DesignHeight="300" d:DesignWidth="400"。正常來說,XAML語法解析器無法識(shí)別DesignHeight和DesignWidth,xmlns:mc命名空間則提供Ignorable標(biāo)識(shí)在運(yùn)行時(shí)忽略該引用聲明,避免了在編譯時(shí)XAML語法報(bào)錯(cuò)。
自定義NameSpace命名空間
在實(shí)際項(xiàng)目中,經(jīng)常會(huì)遇到調(diào)用自定義控件類庫,其調(diào)用方法可以從默認(rèn)XAML命名空間聲明轉(zhuǎn)換得來。
例如,如果需要添加DataGrid數(shù)據(jù)控件到XamlGuideSL項(xiàng)目中,首先需要添加System.Windows.Controls.Data.dll引用文件到Silverlight項(xiàng)目引用文件目錄,
?
?
然后在頁面頭部聲明DataGrid控件所需要的命名空間,XAML頁面才能在.Net Framework中初始化該控件。
?
?
從上圖可以看出,添加命名空間引用時(shí),Visual Studio 11自動(dòng)智能感知,查詢當(dāng)前引用類庫列表中所有可用引用,選擇“System.Windows.Controls”,代碼將自動(dòng)填充到XAML頁面。
?
?
自定義聲明一個(gè)命名空間:xmlns:datagrid="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data"這段代碼中包含三部分的信息:
完成聲明后,調(diào)用方法如下:
<datagrid:DataGrid />
在本篇實(shí)例中,使用Expression Blend生成Sample DataSource,綁定到DataGrid控件作為演示(具體步驟這里不再重復(fù),可參考:Expression Blend實(shí)例中文教程(6) - 項(xiàng)目控件和用戶交互控件快速入門),最終調(diào)用和顯示效果如下:
?
XAML命名空間的x:Class屬性
Silverlight和基于C#,VB.NET的Windows 8 Metro應(yīng)用是用戶界面代碼和后臺(tái)邏輯代碼分離的。其中XAML代碼用于繪制用戶界面,后臺(tái)邏輯代碼可由開發(fā)人員喜好選擇C#或者Visual Basic。XAML既然繼承自XML,也就是說, 其本身不具備事件控制的代碼特性。而為了使XAML能夠?qū)崿F(xiàn)與后臺(tái)邏輯代碼交互,則需要在XAML頁面代碼開始時(shí)聲明x:Class屬性,使其賦值當(dāng)前頁面對(duì)應(yīng)后臺(tái)頁面命名空間,Runtime語法解析器將根據(jù)x:Class提供的頁面命名空間名自動(dòng)創(chuàng)建一個(gè)類,該類繼承自x:Class屬性隸屬對(duì)象元素。完成類創(chuàng)建后,將判斷是否該頁面是否具有同名后臺(tái)代碼類,如果有,將合并當(dāng)前生成類到后臺(tái)代碼類中。XAML的x:Class屬性只能在頁面的根元素中聲明一次,表示在頁面創(chuàng)建時(shí),保證其包含的所有元素對(duì)象僅能被實(shí)例化一次。其聲明語法格式如下:
<元素對(duì)象 x:Class=“命名空間.調(diào)用類名;assembly=程序集名稱”…>
</元素對(duì)象>
下面我們嘗試從實(shí)例中理解x:Class屬性,在XamlGuideSL項(xiàng)目中,<UserControl>定義x:Class="XamlGuideSL.MainPage", 其含義是該XAML頁面繼承自UserControl對(duì)象元素,其對(duì)應(yīng)的后臺(tái)代碼頁面為“XamlGuideSL.MainPage.cs”,XAML語法解析器將自動(dòng)檢測并且鏈接該XAML頁面到“XamlGuideSL.MainPage.MainPage.cs”,在XAML實(shí)例化時(shí),將執(zhí)行“XamlGuideSL.MainPage.cs”后臺(tái)代碼中的構(gòu)造函數(shù)。
?
?
從Visual Studio 11默認(rèn)生成后臺(tái)代碼中可以看出當(dāng)前頁面命名空間是“XamlGuideSL”,Mainpage類繼承自UserControl。在構(gòu)造函數(shù)MainPage()中,將執(zhí)行InitializeComponent()方法,對(duì)XAML頁面對(duì)象元素進(jìn)行屬性設(shè)置,數(shù)據(jù)綁定以及聲明事件等操作。由此可見,InitializeComponent()方法在Silverlight應(yīng)用初始化時(shí)具有非常重要的作用,不能從構(gòu)造函數(shù)中刪除。而在創(chuàng)建新的構(gòu)造函數(shù)時(shí),也必須調(diào)用該方法,對(duì)XAML對(duì)象元素進(jìn)行實(shí)例化操作。
?
XAML命名空間的x:Name屬性和x:Key屬性
在XAML代碼設(shè)計(jì)時(shí),經(jīng)常需要對(duì)控件或者資源進(jìn)行命名,所需要使用的屬性是x:Name和x:Key。下面的表格對(duì)兩者使用范圍進(jìn)行對(duì)比和描述:
在實(shí)際項(xiàng)目中,控件元素和資源的命名規(guī)則是只在需要的時(shí)候?qū)丶唾Y源進(jìn)行命名操作,這樣的好處有以下幾點(diǎn):?
?
XAML的x:ClassModifier屬性和x:FieldModifier屬性
x:ClassModifier屬性和x:FieldModifier屬性主要功能是支持在XAML中設(shè)置后臺(tái)對(duì)應(yīng)代碼類存取屬性.
?
x:ClassModifier屬性僅能被用于根元素對(duì)象,例如,<UserControl>;
x:FieldModifier屬性僅能被用于控件元素對(duì)象,例如,<TextBox>;
?
在XAML代碼中使用x:ClassModifier屬性和x:FieldModifier屬性后,客戶端編譯后,會(huì)在.g.cs或者.g.vb自動(dòng)生成代碼中重新設(shè)置類存取屬性。這里需要注意,對(duì)于x:ClassModifier根元素對(duì)象類存取屬性的控制,在XAML代碼中修改后,必須同時(shí)手工修改對(duì)應(yīng)后臺(tái)代碼中對(duì)應(yīng)元素對(duì)象類的存取屬性。例如:在下面代碼中修改UserControl類存取屬性為internal,
?
同時(shí)也需要修改對(duì)應(yīng)后臺(tái)代碼XamlGuideSL.MainPage類的存取屬性,Visual Studio 11默認(rèn)創(chuàng)建屬性為Public,
?
查看.g.cs自動(dòng)生成代碼,
MainPage的類存取屬性被編譯為internal。
由此,x:FieldModifier屬性的使用不需要手工修改對(duì)應(yīng)控件后臺(tái)代碼存取屬性,直接由XAML設(shè)置即可。
?
Silverlight命名空間和Windows 8命名空間的不同
例如,我們將添加新的引用“MyAssembly.dll”到項(xiàng)目,并且添加新的命名空間"MyAssembly.MyNamespace"到XAML代碼, 在Silverlight中,命名空間定義:
xmlns:local="clr-namespace:MyAssembly.MyNamespace;assembly:MyAssembly"
在Windows 8中,命名空間將使用“using”替換“clr-namespace“,
xmlns:local="using:MyAssembly.MyNamespace"
?
今天暫時(shí)介紹到這里,歡迎留言討論。
源代碼下載
歡迎大家留言交流,或者加入QQ群交流學(xué)習(xí):
22308706(一群) 超級(jí)群500人?
37891947(二群) 超級(jí)群500人?
100844510(三群) 高級(jí)群200人?
32679922(四群) 超級(jí)群500人?
23413513(五群) 高級(jí)群200人?
32679955(六群) 超級(jí)群500人?
88585140(八群) 超級(jí)群500人?
128043302(九群 企業(yè)應(yīng)用開發(fā)推薦群) 高級(jí)群200人?
101364438(十群) 超級(jí)群500人?
68435160(十一群 企業(yè)應(yīng)用開發(fā)推薦群)超級(jí)群500人
轉(zhuǎn)載于:https://www.cnblogs.com/meimao5211/p/3348879.html
總結(jié)
以上是生活随笔為你收集整理的XAML实例教程系列 - 命名空间(NameSpace) 三的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Flex 按钮添加图标
- 下一篇: struts2工作原理