前面關于ControlTempalte的Post當中,隻說明了如何定義的外觀。如果對于很複雜的自定義控件,通常我們還需要在ControlTemplate使用Resource。很顯然,Resource的目的是便于實作元素的重用。另外,我們的自定義模闆通常是在XAML中完成的,因為用代碼實作是非常煩瑣的。對于小的應用程式,這個ControlTemplate一般直接定義在XAML的根元素。對于大的應用程式,通常應該定義在專門的資源XAML檔案中,根元素是ResourceDictionary。
不管定義在什麼地方,除了前面用Style定義外觀,以及用Resource實作元素重用外,ControlTemplate包括一個Trigger元素,它描述在控件屬性發生變化時控件的外觀如何變化。比如自定義Button時需要考慮滑鼠在Button上移動時控件的外觀。Trigger元素也是可選的,比如文本标簽元素,它一般不包括Trigger。
在ControlTemplate中使用資源很簡單,與其他元素中的資源一樣:
<ControlTemplate x:Key="templateThermometer" TargetType="{x:Type ProgressBar}">
<ControlTemplate.Resources>
<RadialGradientBrush x:Key="brushBowl"
GradientOrigin="0.3 0.3">
<GradientStop Offset="0" Color="Pink" />
<GradientStop Offset="1" Color="Red" />
</RadialGradientBrush>
</ControlTemplate.Resources>
<!-- 忽略其他相關内容-->
</ControlTemplate>
接下來是Trigger的使用。利用Trigger對象,我們可以接收到屬性變化或者事件發生,并據此做出适當的響應。Trigger本身也是支援多種類型的,下面是一個屬性Trigger的例子:
<Style TargetType="ListBoxItem">
<Setter Property="Opacity" Value="0.5" />
<Style.Triggers>
<Trigger Property="IsSelected" Value="True">
<Setter Property="Opacity" Value="1.0" />
<!--其他的Setters->
</Trigger>
</Style.Triggers>
</Style>
這段代碼設定ListBoxItem的Opacity屬性的預設值為0.5。但是,在IsSelected屬性為True時,ListBoxItem的Opacity屬性值為1。從上面的代碼還可以看出,在滿足一個條件後,可以觸發多個行為(定義多個Setters)。同樣地,上面的Triggers也是一個集合,也可以添加多個Trigger。
注意上面的多個Trigger是互相獨立的,不會互相影響。另一種情況是需要滿足多個條件時才觸發某種行為。為此,WPF提供了MultiTrigger以滿足這種需求。比如:
<Style TargetType="{x:Type Button}">
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="IsMouseOver" Value="True" />
<Condition Property="Content" Value="{x:Null}" />
</MultiTrigger.Conditions>
<Setter Property="Background" Value="Yellow" />
</MultiTrigger>
這就表示隻有IsMouseOver為True、Content為NULL的時候才将Background設定為Yellow。
以上的Trigger都是基于元素屬性的。對于滑鼠移動等事件的處理,WPF有專門的EventTrigger。但因EventTrigger多數時候是和Storyboard配合使用的。是以,我将在後面介紹動畫的時候詳細說明EventTrigger。
另一方面,現在所讨論的Trigger都是基于屬性的值或者事件的。WPF還支援另一種Trigger:DataTrigger。顯然,這種資料Trigger用于資料發生變化時,也就是說觸發條件的屬性是綁定資料的。類似地,資料Trigger也支援多個條件:MultiDataTrigger。他們的基于用法和前面的Trigger類似。
下一個Post我将分析Windows SDK中ControlTemplateExamples的例子,這個例子涉及了很多的控件模闆使用。
本文轉自賴儀靈部落格園部落格,原文連結:http://www.cnblogs.com/YilingLai/archive/2007/01/17/622672.html,如需轉載請自行聯系原作者。