通過前面的介紹,我們已經(jīng)知道WPF支持用Style Setters修改控件的屬性值,以改變控件的外觀。我們知道,WPF的任何控件都有視覺樹和邏輯樹。但是Style有它自己的局限性:它只能修改控件已有樹型結(jié)構(gòu)的屬性,不能修改控件的樹型層次結(jié)構(gòu)本身。而在實(shí)際運(yùn)用中,我們常常需要對(duì)控件進(jìn)行更高級(jí)的自定義。此時(shí),可以需要使用ControlTemplate才能實(shí)現(xiàn)。 在WPF中,ControlTemplate用來定義控件的外觀。我們可以為控件定義新的ControlTemplate來實(shí)現(xiàn)控件結(jié)構(gòu)和外觀的修改。同樣,我們先看一個(gè)例子: <Style TargetType="Button"> 從例子代碼我們可以看出,ControlTemplate含有模板的語義。也就是說它影響的應(yīng)該是多個(gè)控件。而這個(gè)功能恰好可以利用Style實(shí)現(xiàn)。所以,在理解了Style之后,這樣的代碼應(yīng)該不會(huì)感到陌生。首先把OverridesDefaultStyle設(shè)置為True,表示這個(gè)控件不使用當(dāng)前Themes的任何屬性。然后用Setters修改控件的Template屬性。我們定義了一個(gè)新的ControlTemplate來設(shè)置新的值。 WPF中每個(gè)預(yù)定義的控件都有一個(gè)默認(rèn)的模板,因此,在我們學(xué)習(xí)自定義模板(也就是自定義控件)之前,可以先熟悉了解WPF的默認(rèn)模板。為了便于查看模板的樹形結(jié)構(gòu)層次,我們可以將模板輸出為XML文件格式,這樣能有助于理解。 XmlWriterSettings settings = new XmlWriterSettings(); 這里的ctrl是一個(gè)實(shí)例化的Control類。并且Control需要已經(jīng)顯示在屏幕上,否則Control.Template可能為NULL。 |
|