一、聲明式編程 前面學(xué)的大多都是命令式或過程式編程,,須具體描述某個功能的過程,、算法,怎么實現(xiàn),。
命令式編程:命令“機(jī)器”如何去做事情(how),,這樣不管你想要的是什么(what),它都會按照你的命令實現(xiàn),。 簡單地說:聲明式編程要的是“結(jié)果”,命令式編程要的是“過程” 例如:SQL語句就是聲明式,,它只說明需要的結(jié)果,,如:表中男性最高成績的前三名,至于怎么實現(xiàn),,比如怎么過慮男性 怎么排序,,怎么取得前三名,它都不關(guān)心,,它只要結(jié)果,。 而命令式編程則必須描述怎么過濾男性、怎么排序,、怎么取得前三名,。
通俗的說,聲明式編程更象是一位領(lǐng)導(dǎo),,它只須交待給下屬,,他要的一個結(jié)果,而不去關(guān)心怎么去完成的這個過程,。 命令式編程更象是一位下屬,,它得具體去操作每個細(xì)節(jié),怎么實現(xiàn),,最后才得出結(jié)果,。
VB.net是命令式語言,但也包含一些聲明式結(jié)構(gòu),。比如Handler子句就是聲明式結(jié)構(gòu),。 XAML語言比較接近純粹的聲明式語言,它僅關(guān)注結(jié)果或當(dāng)前狀態(tài),,而不關(guān)注如何實現(xiàn),。
為什么要有聲明式語言? 用聲明式語言能簡單地說明要的結(jié)果,,當(dāng)這個語言(XAML)傳到另一個解讀的程序時,,它會根據(jù)這個結(jié)果,來具體實現(xiàn),。 于是就把結(jié)果與實現(xiàn)分離,。可以想到的是程序的傳輸體積小了,,編程更標(biāo)準(zhǔn)化,、更高效,因為結(jié)果的實現(xiàn)都是由標(biāo)準(zhǔn)地進(jìn)行 實現(xiàn)。
文件-》新建項目,,選擇WPF應(yīng)用程序,,建立ProVB_XAML程序: 界面如上。 窗體的XAML如下:
雙擊解決方案中Application.xaml,可以看到:
注意的是下面是一個語句中,,后面都是
xmlns是XML Namespaces的縮寫,,即XML命名空間。 這四個屬性中:xmlns和xmlns:s分別是指的兩個命名空間,。默認(rèn)的命名空間是指xmlns所指的內(nèi)容,。 但要用另一個怎么辦?用xmlns:x來指明另一個,,這樣要使用這個命名空間的內(nèi)容時就可以用前綴x:來指代,。 于是沒有前綴(省略)的是指第一個,用了x:的是指的是第二個,。
它只是定義了應(yīng)用程序環(huán)境,,后面幾個都是它的結(jié)節(jié),最后一個表示下步打開的是MainWindow.xaml文件,。 Resource里面描述如何使用XAML聲明的對象的屬性,,如控件的顏色、形狀,、和行為等,。
二、XAML語言基礎(chǔ)
前面從感官上認(rèn)識了聲明式編程與XAML,,再看看XAML幾個重要概念 (具體學(xué)習(xí)www.w3schools.com)
1,、XAML子集 XAML還可以被用于其它平臺來表示非.net對象,XAML有以下幾個子集: WPF XAML 描述WPF內(nèi)容的元素,,如矢量圖形,、控件以及文檔。 XPS XAML 是WPF XAML的一部分,,為格式化的電子文檔定義了一種XML表示方式,。(前面說過可以減小傳遞體積) Silvelight XAML 用于Silverlight程序的WPF XAML子集(主要用于二維圖形、動畫音頻,、視頻) WF XAML 描述Windows工作流(WorkFlow)內(nèi)容的元素,。
2、XAML編譯 XML主要用于傳遞數(shù)據(jù),,但沒壓縮,。而WPF使用BAML(binary Application Markup Language二進(jìn)制應(yīng)用程序標(biāo)記語言) 它實際上是XAML的二進(jìn)制表示,更減小了體積,。 不必?fù)?dān)心如何由XAML轉(zhuǎn)為BAML,編譯器會在后臺自動執(zhí)行,當(dāng)然也可以不編譯(比如用戶界面須要自定義時)
3,、XAML標(biāo)準(zhǔn) (1)XAML中所有元素都映射為一個.net類的實例,。元素的名稱也完全對應(yīng)于類名。 如元素<Button>指示W(wǎng)PF創(chuàng)建一個Button對象,。 (2)與XML一樣,,可在一個元素中嵌套另一個元素。 <Grid> <Button> ..... </Button> </Grid> (3)可通過特性(Attribute)來設(shè)置每個類的屬性(Property),。
4,、頂級元素(根) 與XML一樣,XAML只能使用一個頂級元素:
上面頂級元素就是Window,。
頂級元素只能使用下面的: Window元素 Page元素(與Window元素類似,,它僅用于可導(dǎo)航的應(yīng)用程序) Application元素(它定義應(yīng)用程序資源和啟動設(shè)置)
5、XAML的名稱空間 每個元素生成時使用的名稱空間是不一樣,,要引用各個元素的空間顯得非常煩擾和混亂,,怎么有效的把它們組成到一個統(tǒng)一的 名稱空間中來,使得簡捷有效呢,?
答案是用另外的一個名稱空間來包含上面雜亂的空間,。于是形成了下面兩個統(tǒng)一的空間
XMAL使用兩個名稱空間:
(1)http://schemas.microsoft.com/winfx/2006/xaml/presentation
這是WPF的核心名稱空間,它包含了所有WPF類,,包括用于構(gòu)建用戶界面的控件,。它是默認(rèn)的名稱空間, 即省略前綴時,,就是指的是這個名稱空間 (2)http://schemas.microsoft.com/winfx/2006/xaml 這是XAML名稱空間,。它包含各種XAML實用特性,這些特性(Attribute)會影響文檔的解釋方式,。 這個名稱空間被映射為前綴x,,意思是x是一個別名,指代的是這個空間,,只要前綴用了x:就說明用的是這個空間,。 使用形式如<x:ElementName>
注意:XML名稱空間通常用的是URL字符,但這并不是網(wǎng)址,,用它可以區(qū)別是Microsoft公司而不是其它組織,,因為 schemas.com域是由Microsoft公司所擁有的,只有微軟會在XML空間名稱中使用它,。
通過名稱空間(命名空間)XAML解析器可以找到正確的類,,如查找Window和Grid元素時,會先查默認(rèn)WPF的名稱空間,, 再查找.net名稱空間,,直到找到System.Windows.Window類和System.Windows.Controls.Grid類為止,。
6、代碼隱藏類 通過XAML就可以構(gòu)造用戶界面,,但這就是外觀還需要一定的功能,,就需要一個連接包含實現(xiàn)代碼的方法。怎么實現(xiàn),? XAML通過使用Class特性來完成: <Window x:Class="WindowsApplication.Windows1" Class用了前綴x:,,表示是XAML語言中更通用的部分。 Class特性告訴XAML解析器使用指定的名稱生成一個新類,,該類繼承XML元素命名的類,。即: 上面創(chuàng)建了一個名為Window1的新類,該類繼承自Window基類,。 關(guān)鍵: 通過Partial Class部分類,,把一個類分成兩個或多個,并在編譯過的程序集中把這些獨立的部分融合成一起,,就形成 了 界面與代碼的組合,。
三、XML語句
XAML名稱空間中的3類XML語句:特性,、標(biāo)記擴(kuò)展,、XAML指令 注意:特性(Attribute)與屬性(Property)兩者相似,但又不同,。
1,、特性 XML中特性表示與XML節(jié)點相關(guān)的命名屬性。 節(jié)點對象可能有幾個特性,,如Name,、Margin、Text,, 特性只存在于節(jié)點的定義中,,不包含在XML的節(jié)點中:
x:Class 配置 XAML 編譯,在標(biāo)記和代碼隱藏之間連接分部類,。代碼分部類在一個獨立的代碼文件中定義,, 標(biāo)記分部類由代碼生成過程在 XAML 編譯期間創(chuàng)建。
x:FieldModifier 修改 XAML 編譯行為,,使指定對象引用的字段被定義有 public 訪問權(quán)限而不是默認(rèn)的 private 行為,。
x:ClassModifier 在同時提供了 x:Class 的情況下,修改 XAML 編譯行為,。 具體而言,,不必創(chuàng)建有 Public 訪問級別 (默認(rèn)值)的 class 分部類,提供的 x:Class 是以 NotPublic 的訪問級別創(chuàng)建的,。 此行為會影響生成 的程序集中的類的訪問級別,。
x:Key 唯一標(biāo)識作為資源被創(chuàng)建和引用的元素,,這些資源存在于一個 ResourceDictionary 中。
x:Name 唯一標(biāo)識對象元素,,可方便從代碼隱藏或一般代碼中訪問已實例化的對象,。應(yīng)用于支持的編程模型之后, x:Name 可視為等效于持有一個對象引用(由一個構(gòu)造函數(shù)返回)的變量,。
x:Subclass 在同時提供了 x:Class 的情況下,修改 XAML 標(biāo)記編譯行為,。 不必根據(jù) x:Class 類創(chuàng)建分部類,,而是將 提供的 x:Class 創(chuàng)建為中間類,然后提供的派生類應(yīng)基于 x:Class,。
x:Shared 當(dāng)設(shè)置為 false 時,,會修改 WPF 資源檢索行為,以便特性化資源請求為每個請求創(chuàng)建一個新實例,,而不是 所有請求共享同一個實例,。
x:TypeArguments 將泛型的約束類型參數(shù)傳遞給泛型類型的構(gòu)造函數(shù)。
2,、標(biāo)記擴(kuò)展 允許包含格式,,體現(xiàn)Extensible Application XML中的Extensible(擴(kuò)展) x:Array 在XAML里創(chuàng)建一個數(shù)組。使用Array擴(kuò)展創(chuàng)建數(shù)組很容易,,但在詞法上和其他XAML擴(kuò)展不同,,它不需要使用大括號"{}", 原因在于Array里面含有多個元素,。.
x:Null 指定 null 作為通過一個 XAML 屬性設(shè)置的屬性的值,。
x:Reference 引用在 XAML 標(biāo)記中其他地方聲明的實例。 參考涉及元素的 x:Name,。 <object property="{x:Reference instancexName}" .../>
x:Static 按值引用以符合 公共語言規(guī)范 (CLS) 的方式定義的任何靜態(tài)代碼實體,。 引用的靜態(tài)屬性可以用來提供在 XAML 中的屬性的值。 <object property="{x:Static prefix:typeName.staticMemberName}" .../> x:Type 提供 CLR Type 對象,,該對象是指定的 XAML 類型的基礎(chǔ)類型,。 <object property="{x:Type prefix:typeNameValue}" .../> <x:Type TypeName="prefix:typeNameValue"/>
3、XAML指令 后用,,例如由運行時解釋,。
x:XData 在 XAML 生產(chǎn)中開啟 XML 數(shù)據(jù)島的放置。 x:XData 中的 XML 元素不應(yīng)由 XAML 處理器處理,,就像它們屬于作用的
默認(rèn) XAML 命名空間或任何其他 XAML 命名空間的一部分,。 x:XData 可包含任意格式正確的 XML,。
|
|