首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

《Programming WPF》中譯:第 5 章 觸發器完整指南

     編輯:關於.NET

WPF 觸發器讓樣式在條件滿足時自動套用 Setter,條件失效時自動還原。本章系統介紹五種觸發器類型:屬性、多重、多條件屬性、資料、多條件資料、事件觸發器,並說明優先順序與動畫整合要點。

5.6.1 屬性觸發器

監視依賴屬性達到指定值。範例:滑鼠移入按鈕時背景變黃。

<Style TargetType="{x:Type Button}">
  <Style.Triggers>
    <Trigger Property="IsMouseOver" Value="True">
      <Setter Property="Background" Value="Yellow" />
    </Trigger>
  </Style.Triggers>
</Style>

滑鼠懸停效果

  • 單一觸發器可包含多個 Setter(如同時設背景與字體)。
  • 不可設定 Style 屬性本身(會拋出例外)。
  • 條件失效時,依賴屬性系統自動還原預設值,無需額外觸發器。

5.6.2 多重觸發器

Style.Triggers 下可放多個 Trigger,各自獨立評估。若多觸發器設定同一屬性,**最後宣告者優先**。

<Trigger Property="IsMouseOver" Value="True">
  <Setter Property="Background" Value="Yellow" /></Trigger>
<Trigger Property="IsFocused" Value="True">
  <Setter Property="Background" Value="LightGreen" /></Trigger>

多重觸發器效果

同時滿足滑鼠懸停與焦點時,背景為綠色(後宣告勝出)。

5.6.3 多條件屬性觸發器

需所有條件同時滿足才觸發,使用 MultiTrigger + Condition。

<MultiTrigger>
  <MultiTrigger.Conditions>
    <Condition Property="IsMouseOver" Value="True" />
    <Condition Property="Content" Value="{x:Null}" />
  </MultiTrigger.Conditions>
  <Setter Property="Background" Value="Yellow" />
</MultiTrigger>

空格懸停高亮 非空格不高亮

應用於井字遊戲:僅滑鼠懸停且格子為空時高亮。

5.6.4 資料觸發器

監視任意 CLR 物件屬性(非依賴屬性),配合 Binding。常用於資料模板內容呈現。

<Style x:Key="CellTextStyle" TargetType="{x:Type TextBlock}">
  <Style.Triggers>
    <DataTrigger Binding="{Binding Path=PlayerName}" Value="X">
      <Setter Property="Foreground" Value="Red" /></DataTrigger>
    <DataTrigger Binding="{Binding Path=PlayerName}" Value="O">
      <Setter Property="Foreground" Value="Green" /></DataTrigger>
  </Style.Triggers>
</Style>

資料觸發器效果

  • 需放在內容的 Style(如 DataTemplate 內元素),而非控制項 Style。
  • 依賴 INotifyPropertyChanged 通知機制;靜態資料無需實作。
  • 內容為 null 時條件自動判定為 false,避免例外。

5.6.5 多條件資料觸發器

MultiDataTrigger 結合多個 Binding 條件(AND 邏輯)。範例:第 10 步且玩家為 O 時特效。

<MultiDataTrigger>
  <MultiDataTrigger.Conditions>
    <Condition Binding="{Binding Path=PlayerName}" Value="O" />
    <Condition Binding="{Binding Path=MoveNumber}">
      <Condition.Value><sys:Int32>10</sys:Int32></Condition.Value>
    </Condition>
  </MultiDataTrigger.Conditions>
  <Setter Property="Background" Value="Yellow" />
</MultiDataTrigger>

需透過 XML 命名空間映射引入 sys:Int32 確保型別正確比對。

5.6.6 事件觸發器

監視路由事件(如 Click),啟動動畫(Storyboard)。動畫在第 8 章詳細介紹。

<Style TargetType="{x:Type Button}">
  <Setter Property="Background" Value="White" />
  <Style.Storyboards>
    <ParallelTimeline Name="CellClickedTimeline" BeginTime="{x:Null}">
      <SetterTimeline Path="(Button.Background).(SolidColorBrush.Color)">
        <ColorAnimation From="Yellow" To="White" Duration="0:0:5" />
      </SetterTimeline>
    </ParallelTimeline>
  </Style.Storyboards>
  <Style.Triggers>
    <EventTrigger RoutedEvent="Click">
      <EventTrigger.Actions>
        <BeginAction TargetName="CellClickedTimeline" />
      </EventTrigger.Actions>
    </EventTrigger>
  </Style.Triggers>
</Style>

點擊動畫效果

  • 動畫目標屬性需有顯式基礎 Setter建立巢狀路徑(如 Background),否則執行期無效果。
  • XAML 宣告順序:多條件觸發器必須置於事件觸發器之前,否則會發生執行期錯誤。

總結

觸發器類型監視目標動作
Property Trigger依賴屬性設定屬性值
MultiTrigger多個依賴屬性 (AND)設定屬性值
DataTriggerCLR 屬性 (Binding)設定屬性值
MultiDataTrigger多個 Binding (AND)設定屬性值
EventTrigger路由事件啟動動畫

觸發器以宣告式方式賦予 UI 互動行為,極少或無程式碼,是 WPF 樣式系統的核心威力。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved