轉自:http://blog.csdn.net/lisenyang/article/details/18312067
程序的本質就是「數據+算法」------用戶輸入原始的數據,算法處理原始數據並獲得結果數據。問題就在於程序如何將結果數據顯示給用戶。一樣一組數據,你可使用LED陣列顯示出來,或者以命令行模式藉助各類格式控制符(如TAB)對齊並輸出,但這些都不如圖形界面(GUI Graphic User Interface)來的友好和方便。GUI的方便在於它對數據展現的直觀性,程序員能夠經過編程的方式將數據經過圖形的方式展現出來,從而避免了用戶面對一大堆複雜數據的痛苦。提升了工做效率,普及了計算機的操做。程序員
GUI是程序界面的優勝者,在Windows上實現圖形用戶界面有不少種方法,每種方法又都有本身的一套開發理念和工具。每種GUI開發方法與它的理念和工具共同組成了一種方法論,常見的有:算法
- Windows API(Win API):調用Windows的底層繪圖函數,使用C語言,最原始也是最基礎的。
- Microsoft Foundition Class(MFC):使用C++語言將最原始的Win32 API封裝成控件類。
- Visual Component Library(VCL):Delphi和C++ Builder使用的與MFC相近的控件類庫。
- Visual Basic+ActiveX(VB6):使用組件化的思想把Win32 API封裝成控件,以期與多種語言共用。
- Java Swing/AWT:Java SDK中用於跨平臺開發的控件類庫。
- Windows Form:.NET平臺上用於開發GUI的老牌勁旅,徹底組件化,可是須要.net運行時支持。
- Windows Presentation Foundition(WPF):後起之秀,使用全新的數據驅動UI理念。
縱覽Windows GUI開發歷程,這些方法論能夠分爲4代:編程
- Win API時代:函數調用+消息處理。
- 封裝時代:使用面向對象理念將Win API封裝成類,由來自UI的消息驅動程序處理數據。
- 組件化時代:使用面向組件理念在類的基礎上分裝成組件;消息被封裝成了事件。變成事件驅動。
- WPF時代:在組件的基礎上,使用專門的UI設計語言並引入數據驅動UI的理念。
WPF之因此會被稱作是新一代關鍵有兩點:第一,以前幾代GUI只是使用編程語言進行UI設計,而WPF有本身專門設計UI的語言XAML。第二:前幾代的UI在和數據交互上都是由Windows消息到控件事件一脈相承,始終把UI控件放在主導地位而數據處於被動地位,用UI來驅動數據的改變,WPF在事件驅動的基礎上引入了數據驅動的理念,讓數據重歸核心地位讓UI迴歸數據表達者的地位。編程語言
UI是讓用戶可以觀察數據和操做數據,爲了讓用戶觀察數據,咱們須要用UI來顯示數據;爲了讓用戶能夠操做數據,咱們須要使用UI來響應用戶的操做。WPF中那些可以展現數據響應用戶操做的UI元素稱之爲控件(Control)。控件所展現的數據,咱們稱之爲控件的「數據內容」。控件在響應用戶的操做以後會執行本身的一些方法或以事件的方式通知應用程序,咱們稱之爲控件的行爲或算法內容。可見WPF中的控件扮演着雙重角色,是個很是抽象的概念。-----Control是數據和行爲的載體。而無需具備固定的形象。函數
2 WPF的內容模型工具
所謂物以類聚,根據是否能夠轉載內容,可以裝載什麼樣的內容,WPF中的內容能夠分爲如下幾種類型:組件化
![](http://static.javashuo.com/static/loading.gif)
能夠把控件想象成一個容器,容器中的內容就是控件的內容。控件的內容能夠直接是數據,也能夠是控件。當控件的內容仍是控件的時候就造成了控件的嵌套,因此WPF中的UI會呈現出一種樹形結構。若是不考慮控件內部的樹形結構,只觀察用控件組成的樹,那麼這棵樹稱爲邏輯樹(Logical Tree);WPF控件每每是由更基本的控件構成的,即控件自己就是一棵樹,若是連控件自己的樹都考慮在內,這棵樹比邏輯樹更繁茂,這棵樹被稱爲可視元素樹(Visual Tree)。佈局
控件是內存中的對象,控件的內容也是內存中的對象。控件經過本身的某個屬性引用着其做爲內容的對象。這個屬性稱爲內容屬性。內容屬性是個統稱,具體到某個控件的時候,內容屬性都有本身確切的名字-------有的直接叫Content,有的叫Child;有些控件的內容能夠是集合,其內容屬性有叫Items或叫Children的。ui
3 各內容模型詳解.net
咱們把符合某類類容模型的元素稱爲一個族,每一個族用它們共同的基類來命名。
3.1 ContentControl族
該族控件有如下特色
- 均派生自ContentControl類。
- 它們都是控件。
- 內容屬性的名稱是Content。
- 只能由單一內容充當其內容。
3.2 HeaderedContentControl
該族控件有以下特色
- 均派生自HeaderedContentControl類,HeaderedContentControl是ContentControl的派生類。
- 它們都是控件,用於顯示帶標題的數據。
- 除了用於顯示主體內容的區域外,控件還有一個顯示標題的區域。
- 內容屬性爲Content和Header。
- 不管是Content仍是Header都只容許一個元素做爲器內容。
3.3 ItemControl族
特色:
均派生自ItemControl類。
它們都是控件,用於顯示列表化的數據。
內容屬性爲Items或者ItemsSource。
每種ItemControl都對應着本身的條目容器(Item Container)。
3.4 HeaderedItemControl
- 本族控件不光要具有ItemControl的特性外,還要具備顯示標題的能力。
- 該族控件有如下特色:
- 均派生自HeaderedItemControl類。
- 它們都是控件,用於顯示列表化的數據,同時能夠支持顯示一個標題。
- 內容屬性爲Items,ItemsSource和Header。
本族控件只有3個:MenuItem、TreeViewItem、ToolBar。
3.5 Decorator族
本族元素是在UI上起裝飾效果的。本族元素特定以下:
- 均派生自Decorator類。
- 起UI裝飾做用。
- 內容屬性爲Child。
- 只能有單一內容充當其內容。
3.6 TextBox和TextBlock。
這兩個控件最主要的功能就是顯示文本。TextBlock只能顯示文本,不能被編輯,因此又稱爲靜態文本。TextBox則容許用戶編輯裏面的內容。TextBlock雖然不能編輯內容,可是可使用豐富的印刷級的格式控制標記顯示出專業的排版效果。
TextBox不須要太多的格式顯示,因此它的內容就是簡單的字符串,內容屬性爲Text。
TextBlock因爲須要操做格式,因此內容屬性是Inlines(印刷中的「行」),同時TextBlock也保留了一個Text屬性,當顯示一個簡單的字符串,可使用這個屬性。
3.7 Shape族元素。
友好的界面離不開圖形的搭配,Shape族元素就是專門用來在UI上繪製圖形的一類元素。這類元素沒有本身的內容,咱們可使用Fill元素爲其設置填充效果,還可使用Stroke屬性爲它們設置邊線效果。
本族元素特定以下:
- 均派生自Shape類。
- 用於2D圖像的繪製。
- 無內容屬性。
- 使用Fill設置填充,使用Stroke設置邊線。
3.8 Panel族元素
本族元素特色以下:
- 均派生自Panel類。
- 主要功能是控制UI佈局。
- 內容屬性爲Children。
- 內容能夠是多個元素,Panel將控制它們的佈局。