1.4.1.2 用 xaml 描述使用者介面
windows 表現層基礎庫(windowspresentation foundation,wpf)是用於建立使用者介面的 .net 庫,這個庫支援宣告式程式設計風格,它將描述使用者介面部分與實現命令式程式邏輯的部分分隔開來。使用windows 表現層基礎庫的最好辦法,是使程式邏輯盡可能小,並盡可能多地以宣告式方式建立。
宣告式的描述用樹狀結構表示,其構成的每個物件表示圖形使用者介面的元素。它可以用 c# 建立,但windows 表現層基礎庫還提供更好的方法,使用基於 xml 的語言,稱為 xaml。不過,我們會看到在 xaml 和 linq 之間存在著很多的相似性。清單 1.5 是 xaml **與使用命令式 windows forms 庫**的對比,它們實現同樣的功能。
listing 1.5 creating a ui using thedeclarative and imperative styles (xaml and c#)
<
canvas
background
="black">
<
ellipse
x:name
="greenellipse"width
="75"height
="75"
canvas.left
="0"canvas.top
="0"fill
="lightgreen"/>
canvas
>
//imperative user inte***ce using windows forms
protected
override
voidonpaint(painteventargs e)
確定是什麼使第一段**段更具宣告性並不困難。xaml **通過組合基元,並指定其屬性來描述使用者介面,整個**就是乙個表示式,它建立乙個黑色畫布,包含綠色的橢圓。命令式版本說明了如何繪製使用者介面,通過語句序列指定應該執行哪些操作,才能獲得所需的圖形使用者介面。這個示例演示了了兩者的區別,宣告式風格只要說明幹「什麼」,而命令式風格必須指定「怎麼」幹。
在宣告性的版本中,我們不需要更多了解底層的技術細節。如果你看這段**,並不需要知道wpf 是如何表示,並繪製圖形使用者介面的。而使用 windows forms 的**,可以看到所有的技術細節,(比如,畫筆的表示和繪圖的順序)。在清單 1.5 中,xaml 和繪圖**的對應關係是清楚的,我們可以用 wpf 和 xaml 來描述更複雜的程式。讓我們看乙個示例:
<
doubleanimation
storyboard.targetname
="greenellipse"
storyboard.targetproperty
="(canvas.left)"
from
="0.0"to
="100.0"duration
="0:0:5"/>
這是乙個表示式,建立了動畫,改變橢圓的 left 屬性(通過名字greenellipse 指定),其值在 5 秒內從 0 到 100。**是用 xaml 實現的,我們也可以用 c# 來寫,通過顯式構造物件樹。doubleanimation 是乙個類,因此可以指定其屬性。但是,用xaml 語言來寫更具宣告性。但是,不管哪種情況,**能具有宣告性,都要感謝 wpf。用傳統的命令式**實現動畫相當複雜,必須建立乙個計時器,並註冊事件處理程式,每隔幾毫秒呼叫一次,來計算橢圓的新位置。
用.net 進行宣告式程式設計
wpf 和 linq 是兩個具有宣告式風格程式設計的主流技術,當然還有其他的。linq 的目標是簡化處理資料的一種通用語言,它借鑑了很多具有宣告風格的資料處理語言的思想,例如,在sql 或 xslt 中也可以發現宣告式的方法。
使用宣告式風格的另一領域是在 c# 或 vb.net 中使用 .net 特性。特性是用來註解類或其成員的一種方法,指定其如何能在特定情況下使用。比如,在設計器中編輯圖形使用者介面控制項,這就是宣告式的,因為,當我們正在處理控制時,說明希望從設計器得到什麼,而不是通過寫**,以命令方式來配置設計器的。
到目前為止,我們已經看到了基於宣告式風格的幾種技術,知道它們能使問題更容易解決。你可能會問自己,我們如何用它來解決自己的問題,在下一節,我們將簡單介紹一下第十五章中的乙個示例。
用XAML做網頁!! 開篇
這幾日一直沒發表新文章,一來是因為事比較多,二來就是我在研究使用 xaml 挑戰傳統 html 我對這次挑戰的結果打7分 xaml 在頁面布局 圖形 動畫及可控性方面的表現堪稱完美,我甚至根本想不出來有什麼能與之平分秋色 相容性方面,xaml 通吃所有 windows 平台的各種瀏覽器,它實際上都是...
WPF資料繫結 用XAML繫結
用xaml繫結 wpf元素不僅是資料繫結的目標,它還可以是繫結的源。可以把乙個wpf元素的源屬性繫結到另乙個wpf元素的目標屬性上。elementname指向繫結源,path指向源屬性 此處checkbox為繫結源,ischecked為源屬性,label為目標 除了用xaml 定義繫結資訊之外,還可...
用XAML做網頁!! 終結篇
迄今為止的設計都很順利,但這次就不得不接觸我前面所說的非常糟糕的流文件了,但在此之前先來把標題弄好 mailmail簡介 textblock border 效果 接下來就是流文件嵌入工作了,還記得之 這篇文章 中編輯的流文件嗎?我的計畫是使用乙個frame元素嵌入這個流文件,frame元素類似於網頁...