天天看點

8天入門wpf—— 第四天 模闆

今天說下wpf中的模闆,前面一篇中我們講到了style,但是style所能做的僅僅是在現有控件的基礎上進行修修補補,但是如果我們想

徹底颠覆控件樣式,那麼我們就必須使用這一篇所說的模闆。

老外寫書都喜歡在篇頭搞一個類圖,友善我們宏觀認識,這裡我也上一個。

8天入門wpf—— 第四天 模闆

一:控件模闆

1:controltemplate

我們知道wpf的控件都是繼承自control,在control類中有一個template屬性,類型就是controltemplate。

8天入門wpf—— 第四天 模闆

那麼利用這個controltemplate就可以徹底的颠覆控件的預設外觀,這裡我把一個checkbox變成一個小矩形,蠻有意思的。

8天入門wpf—— 第四天 模闆

确實,我們幹了一件漂亮的事情,把checkbox變成了“小矩形”,但是我們發現了一個小問題,為什麼我的content=“xxx”沒有顯示到模闆上?

很簡單,我們已經重定義了控件模闆,預設模闆将會被覆寫...

2:contentpresenter

幸好,wpf給我們提供了一個contentpresenter,它的作用就是把原有模闆的屬性原封不動的投放到自定義模闆中。

8天入門wpf—— 第四天 模闆

當然你也可以玩一些小技巧,比如我想在"矩形“和”文字”中間設定邊距,那麼我們可以設定contentpresenter的margin。

8天入門wpf—— 第四天 模闆

如果你夠聰明,你會發現我設定的margin是一個非常呆闆的事情,意思就是說能不能根據具體控件靈活控制margin呢?答案肯定是沒問題的,

因為我們記得一個控件可以綁定到另一個控件上,比如這裡我将模闆中的margin綁定到原控件中的padding上去。

8天入門wpf—— 第四天 模闆

3:trigger

我們知道style裡面也是有trigger的,廢話不多說,上代碼說話。

8天入門wpf—— 第四天 模闆
8天入門wpf—— 第四天 模闆

最後形成的效果就是當checkbox選中時為實心框,不選中為空心框。

4:與style混搭

可能剛才我也說了,style隻能在原有的控件基礎上修修補補,如果我們讓style修補control控件的template屬性時,此時我們是不是

就可以實作controltemplate和style的混搭呢?

8天入門wpf—— 第四天 模闆

二:資料模闆

現在我們已經知道“控件模闆”是用于改變控件外觀,那麼“資料模闆”顧名思義就是控制資料的顯示方式,下面做個demo讓person綁定到listbox上。

xaml:

8天入門wpf—— 第四天 模闆

最後我們發現,listbox中并沒有呈現我們需要的資料,隻是呈現了目前類的tostring()方法,很簡單,因為我們綁定的不是簡單的資料類型集合,

而是多字段的複雜類型,更重要的是我們并沒有告訴wpf該如何呈現person資料。

<1>重寫tostring()

既然wpf在render資料的時候呈現的是目前的tostring()形式,那下面我們來重寫tostring()試試看。

最後看看效果,如我們所願,person資訊已經呈現。

8天入門wpf—— 第四天 模闆

<2>datatemplate重寫

或許有的人比較苛刻,他需要person是作為矩形一塊一塊的呈現,而不是這些簡單的形式,那麼此時我們就可以用datatemplate來颠覆。

8天入門wpf—— 第四天 模闆

哈哈,果然是以一塊一塊的形式展現,大功告成,當然這裡的”觸發器“和”style混搭“跟conroltemplate非常相似,我想應該不需要累贅了。

三: itemspaneltemplate

在條目控件(itemcontrol)裡面,有一個屬性叫itempanel,類型是itempaneltemplate。

8天入門wpf—— 第四天 模闆

那麼itemspaneltemplate主要用來幹什麼的呢?首先我們要知道常見的條目控件有:listbox,menu,statusbar,比如拿listbox來說,

我們經過仔細研究,發現itembox的itempanel其實是一個visualizingstackpanel,就是說listbox的每一項的排列方式是遵循stackpanel的

原則,也就是從上到下的排列方式,比如”一線碼農“和”小師妹“是按照豎行排列方式,好,我現在的要求就是能夠”橫排“,該如何做到呢?

8天入門wpf—— 第四天 模闆

哈哈,确實有意思,我們改變了listbox中item的預設排序方向,當然在menu,statusbar中我們也可以用同樣的方式來更改。

四: hierarchicaldatatemplate

它是針對具有分層資料結構的控件設計的,比如說treeview,相當于可以每一個層級上做datatemplate,很好很強大。

8天入門wpf—— 第四天 模闆