新聞中心
WPF縮寫為Windows Presentation Foundation的縮寫,本文所要談的就是WPF本質(zhì)中的數(shù)據(jù)和行為,希望通過(guò)本文能對(duì)大家了解WPF本質(zhì)有所幫助。

如果自己來(lái)做一個(gè)UI框架,我們會(huì)首先關(guān)注哪些方面?我想U(xiǎn)I框架主要處理的一定包括兩個(gè)主要層次的內(nèi)容,一個(gè)是數(shù)據(jù)展現(xiàn),另一個(gè)就是數(shù)據(jù)操作,所以UI框架必須能夠接收各種不同的數(shù)據(jù)并通過(guò)UI界面展現(xiàn)出來(lái),然后可以通過(guò)控件行為來(lái)操作這些數(shù)據(jù),也就是UI框架的數(shù)據(jù)(Data)和行為(Behavior)。
#T#
本篇從總體上講解一下WPF如何處理和操作Data,看完之后大家應(yīng)該對(duì)WPF框架如何把數(shù)據(jù)轉(zhuǎn)變?yōu)檎宫F(xiàn)界面有初步的認(rèn)識(shí),這也是WPF本質(zhì)的核心設(shè)計(jì)之一。
數(shù)據(jù)(Data)
以前的UI框架的控件對(duì)控件數(shù)據(jù)類型都有規(guī)定,按鈕上顯示的是文本或者加上一個(gè)圖片,下拉框顯示的都是字符串或者帶上一個(gè)object類型屬性的作為保存對(duì)象引用用。而WPF則不同,它缺省的數(shù)據(jù)類型為object,這就允許控件能夠操作任意類型的數(shù)據(jù),這也是它靈活和強(qiáng)大的地方之一。
數(shù)據(jù)類型
原始數(shù)據(jù):字符串、布爾、整形等
列表數(shù)據(jù):數(shù)組、列表等,集合中的內(nèi)容可以是相同類型或者不同類型的數(shù)據(jù)
層級(jí)數(shù)據(jù):樹(shù)、列表的列表或者圖等,具有層級(jí)關(guān)系的數(shù)據(jù)
組合數(shù)據(jù):包含以上多種數(shù)據(jù)的數(shù)據(jù),如用戶聯(lián)系方式包括電話、地址1、地址2、手機(jī)號(hào)等
但是如果是object類型,那WPF如何知道具體該如何顯示這些數(shù)據(jù)呢?這就要通過(guò)Templates、Presenters、Binding and Converters、Layout和Styles了。
模板(Templates)
控件模板(control template):控件模板定義一個(gè)控件的外觀,這個(gè)控件主要和UI相關(guān),一般也不和Data有關(guān)。每個(gè)控件都有個(gè)一個(gè)缺省的控件模板。
x:Key=”buttonTemplate”> Width=”100” Height=”100”> StartPoint=”0,0” EndPoint=”0,1”> Offset=”0” Color=”Blue”/> Offset=”1” Color=”Red”/> Width=”80” Height=”80”> StartPoint=”0,0” EndPoint=”0,1”> Offset=”0” Color=”White”/> Offset=”1” Color=”Transparent”/>
數(shù)據(jù)模板(data template):數(shù)據(jù)模板負(fù)責(zé)定制任何一個(gè).Net對(duì)象的外觀,這對(duì)于非UIElement控件非常重要,非UIElement控件的默認(rèn)模板僅僅是一個(gè)TextBlock,其中包含了一個(gè)由ToString方法反會(huì)的字符串。
x:Name=”pictureBox” ItemsSource=”{Binding Source={StaticResource photos}}” …> Source=”placeholder.jpg” Height=”35”/> - …
大家可以通過(guò)工具ShowMeTheTemplate 來(lái)查看一下現(xiàn)有控件的默認(rèn)模板。
內(nèi)容控件(Presenters)
通過(guò)Templates講解,我們現(xiàn)在知道控件模板定義控件外觀,數(shù)據(jù)模板定義特定的數(shù)據(jù)如何顯示,那么現(xiàn)在如何將定義的數(shù)據(jù)顯示在控件外觀上顯示呢?那就需要content presenter了。每個(gè)控件都有一個(gè)默認(rèn)的ContentPresenter用于顯示Content內(nèi)容,我們稱這種控件為內(nèi)容控件,ContentPresenter負(fù)責(zé)將ContentControl的Content屬性顯示出來(lái),如以下代碼示例:
-
-
-
-
-
綁定(Binding) 和 轉(zhuǎn)換(Converters)
數(shù)據(jù)模板描述了數(shù)據(jù)顯示的外觀,我們?nèi)绾问沟眠@些外觀和數(shù)據(jù)關(guān)聯(lián)起來(lái)呢?這就是數(shù)據(jù)綁定(data binding)來(lái)做的事情。WPF的數(shù)據(jù)綁定是一個(gè)強(qiáng)大的功能,它允許單項(xiàng)和雙向的綁定,當(dāng)對(duì)象更改時(shí)UI會(huì)自動(dòng)刷新,當(dāng)UI操作后數(shù)據(jù)也可以自動(dòng)更改。
有時(shí)候數(shù)據(jù)的格式并不只是簡(jiǎn)答的顯示,比如bool類型需要顯示成三態(tài),可以通過(guò)一個(gè)轉(zhuǎn)換器來(lái)實(shí)現(xiàn)。
Binding和Converters代碼示例:網(wǎng)上很多這個(gè)資料,可以參考WPF Data Binding、Binding Converters
布局(Layout)
經(jīng)過(guò)前面的步驟,模板已經(jīng)定義了,數(shù)據(jù)也有了,轉(zhuǎn)換器和綁定也觸發(fā)了,內(nèi)容顯示也生成了,剩下最后一步就是布局(layout)。布局系統(tǒng)將確定前面生產(chǎn)的所有UI控件的大小和位置。在WPF中panel以及其繼承類負(fù)責(zé)提供layout功能。布局是一種遞歸的分兩個(gè)步驟進(jìn)行的過(guò)程,第一步叫做檢測(cè)(measuer),第二步叫做排列(arrange)。
檢測(cè):面板詢問(wèn)其子元素到底需要多少空間,這里假設(shè)有足夠的控件。面板會(huì)重載FrameworkElement的MeasureOverride方法來(lái)實(shí)現(xiàn)這一步。
排列:在檢測(cè)步驟完成后,就該排列元素了。面板會(huì)告訴子元素它們將放在哪里,它們有多少空間可以用。面板會(huì)重載FramworkElement的ArrangeOverride方法來(lái)實(shí)現(xiàn)這一步驟。
樣式(Style)
樣式是一種簡(jiǎn)單的機(jī)制,通過(guò)它可以把屬性值和用戶界面元素分類開(kāi)來(lái),有點(diǎn)類似CSS與HTML的關(guān)系
以上內(nèi)容可以表達(dá)為下圖:Person數(shù)據(jù)經(jīng)過(guò)控件模板、數(shù)據(jù)模板以及樣式和布局,再加上數(shù)據(jù)綁定就可以展現(xiàn)數(shù)據(jù)了。
行為(Behavior)
把數(shù)據(jù)顯示出來(lái)只是做了一半工作,還有一半就是提供用戶方式與UI進(jìn)行交互。下圖說(shuō)明了輸入操作示意圖:
WPF控件支持鼠標(biāo)、鍵盤和寫字板等輸入設(shè)備來(lái)與UI進(jìn)行交互,還可以通過(guò)外部和內(nèi)部時(shí)間進(jìn)行操作,經(jīng)過(guò)觸發(fā)后可以通過(guò)事件處理或者command機(jī)制來(lái)進(jìn)行Action。
當(dāng)前文章:淺談WPF本質(zhì)中的數(shù)據(jù)和行為
網(wǎng)頁(yè)路徑:http://m.fisionsoft.com.cn/article/coihcce.html


咨詢
建站咨詢
