今天說下wpf中的模闆,前面一篇中我們講到了style,但是style所能做的僅僅是在現有控件的基礎上進行修修補補,但是如果我們想
徹底颠覆控件樣式,那麼我們就必須使用這一篇所說的模闆。
老外寫書都喜歡在篇頭搞一個類圖,友善我們宏觀認識,這裡我也上一個。
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5yN2QDNwUjMycjM2AjMxAjMvwVM0cDNxIzLcJTMwIzLcNXZnFWbp9CXt92YuM3ZvxmYuNmLyADMjlGcvw1LcpDc0RHaiojIsJye.png)
一:控件模闆
1:controltemplate
我們知道wpf的控件都是繼承自control,在control類中有一個template屬性,類型就是controltemplate。
那麼利用這個controltemplate就可以徹底的颠覆控件的預設外觀,這裡我把一個checkbox變成一個小矩形,蠻有意思的。
确實,我們幹了一件漂亮的事情,把checkbox變成了“小矩形”,但是我們發現了一個小問題,為什麼我的content=“xxx”沒有顯示到模闆上?
很簡單,我們已經重定義了控件模闆,預設模闆将會被覆寫...
2:contentpresenter
幸好,wpf給我們提供了一個contentpresenter,它的作用就是把原有模闆的屬性原封不動的投放到自定義模闆中。
當然你也可以玩一些小技巧,比如我想在"矩形“和”文字”中間設定邊距,那麼我們可以設定contentpresenter的margin。
如果你夠聰明,你會發現我設定的margin是一個非常呆闆的事情,意思就是說能不能根據具體控件靈活控制margin呢?答案肯定是沒問題的,
因為我們記得一個控件可以綁定到另一個控件上,比如這裡我将模闆中的margin綁定到原控件中的padding上去。
3:trigger
我們知道style裡面也是有trigger的,廢話不多說,上代碼說話。
最後形成的效果就是當checkbox選中時為實心框,不選中為空心框。
4:與style混搭
可能剛才我也說了,style隻能在原有的控件基礎上修修補補,如果我們讓style修補control控件的template屬性時,此時我們是不是
就可以實作controltemplate和style的混搭呢?
二:資料模闆
現在我們已經知道“控件模闆”是用于改變控件外觀,那麼“資料模闆”顧名思義就是控制資料的顯示方式,下面做個demo讓person綁定到listbox上。
xaml:
最後我們發現,listbox中并沒有呈現我們需要的資料,隻是呈現了目前類的tostring()方法,很簡單,因為我們綁定的不是簡單的資料類型集合,
而是多字段的複雜類型,更重要的是我們并沒有告訴wpf該如何呈現person資料。
<1>重寫tostring()
既然wpf在render資料的時候呈現的是目前的tostring()形式,那下面我們來重寫tostring()試試看。
最後看看效果,如我們所願,person資訊已經呈現。
<2>datatemplate重寫
或許有的人比較苛刻,他需要person是作為矩形一塊一塊的呈現,而不是這些簡單的形式,那麼此時我們就可以用datatemplate來颠覆。
哈哈,果然是以一塊一塊的形式展現,大功告成,當然這裡的”觸發器“和”style混搭“跟conroltemplate非常相似,我想應該不需要累贅了。
三: itemspaneltemplate
在條目控件(itemcontrol)裡面,有一個屬性叫itempanel,類型是itempaneltemplate。
那麼itemspaneltemplate主要用來幹什麼的呢?首先我們要知道常見的條目控件有:listbox,menu,statusbar,比如拿listbox來說,
我們經過仔細研究,發現itembox的itempanel其實是一個visualizingstackpanel,就是說listbox的每一項的排列方式是遵循stackpanel的
原則,也就是從上到下的排列方式,比如”一線碼農“和”小師妹“是按照豎行排列方式,好,我現在的要求就是能夠”橫排“,該如何做到呢?
哈哈,确實有意思,我們改變了listbox中item的預設排序方向,當然在menu,statusbar中我們也可以用同樣的方式來更改。
四: hierarchicaldatatemplate
它是針對具有分層資料結構的控件設計的,比如說treeview,相當于可以每一個層級上做datatemplate,很好很強大。