天天看點

閑話WPF之二四(WPF中的ControlTemplate [2])

前面關于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,如需轉載請自行聯系原作者。

繼續閱讀