觸發器 Trigger
觸發器(Trigger)是 WPF 中的一種機制:
當某個條件滿足時,自動改變控件的某些屬性,比如顏色、大小、透明度等。
換句話說,就是"如果……那么就……" 的一種規則。
常見觸發器類型:
類型 | 說明 |
---|---|
Trigger | 依賴屬性變化時觸發 |
DataTrigger | 綁定的數據變化時觸發 |
EventTrigger | 事件發生時觸發 |
MultiTrigger | 多個條件同時滿足時觸發 |
MultiDataTrigger | 多個數據條件同時滿足時觸發 |
1. Trigger
—— 屬性值觸發(最基礎)
例如,當按鈕被鼠標懸停(IsMouseOver = true
)時,改變背景色:
<Button Content="鼠標懸停變色"><Button.Style><Style TargetType="Button"><Style.Triggers><Trigger Property="IsMouseOver" Value="True"> <!--Is... 觸發條件--><Setter Property="Background" Value="LightGreen"/><Setter Property="Foreground" Value="DarkBlue"/></Trigger></Style.Triggers></Style></Button.Style>
</Button>
? 效果:鼠標懸停到按鈕上時,按鈕背景變綠、文字變藍。
相關屬性:
屬性 / 子元素 | 類型 | 說明 |
---|---|---|
Property | DependencyProperty | 觸發器監聽的屬性(比如 IsMouseOver ) |
Value | object | 當 Property 的值等于這個 Value 時觸發 |
Setters | 集合(Setter ) | 滿足條件后要應用的一組屬性修改(比如改顏色、改大小) |
EnterActions | 集合(TriggerAction ) | 當進入觸發狀態時執行的動作(比如動畫) |
ExitActions | 集合(TriggerAction ) | 當離開觸發狀態時執行的動作 |
常用條件:
屬性觸發器(PropertyTrigger)常用條件:
屬性名 | 說明 |
---|---|
IsMouseOver | 鼠標懸停在控件上時為 True |
IsPressed | 按鈕等控件被按下時為 True |
IsEnabled | 控件是否啟用(禁用時為 False ) |
IsFocused | 控件是否獲得焦點(獲取為 True) |
IsChecked | 復選框(CheckBox)、單選按鈕(RadioButton)是否選中 |
IsSelected | 列表項(ListBoxItem、TabItem等)是否被選中 |
Visibility | 控件是否可見(Visible / Hidden / Collapsed) |
IsReadOnly | 文本框(TextBox)是否只讀 |
Orientation | StackPanel等控件的方向(Horizontal / Vertical) |
2. DataTrigger
—— 數據變化觸發
當綁定的數據滿足某條件時,觸發樣式改變。
例子:如果按鈕綁定的某個值是 "危險"
,就變成紅色。
<Button Content="按鈕" Tag="危險"><Button.Style><Style TargetType="Button"><Style.Triggers><DataTrigger Binding="{Binding Tag, RelativeSource={RelativeSource Self}}" Value="危險"><Setter Property="Background" Value="Red"/></DataTrigger></Style.Triggers></Style></Button.Style>
</Button>
? Tag
屬性是 “危險” 時,按鈕背景變紅。
常用條件
DataTrigger 用于根據綁定到的數據(DataContext)變化觸發,比如:
綁定屬性 | 說明 |
---|---|
自定義屬性值 | 比如某個 ViewModel 中的 Status == "完成" |
布爾型標志 | 比如 IsLoading == true |
數值型、字符串型比較 | 比如 Level > 5 (需要結合 Converter 實現) |
3. EventTrigger
—— 事件發生時觸發動作(一般配合動畫)
例子:當按鈕加載完畢(Loaded
事件),讓按鈕慢慢變大:
<Button Content="加載放大按鈕"><Button.Triggers><EventTrigger RoutedEvent="Button.Loaded"><BeginStoryboard> <!--動畫--><Storyboard><DoubleAnimation Storyboard.TargetProperty="Width"From="100" To="200" Duration="0:0:2"/></Storyboard></BeginStoryboard></EventTrigger></Button.Triggers>
</Button>
? 效果:按鈕出現后,2秒內寬度從100變到200。
主要屬性
屬性 / 子元素 | 類型 | 說明 |
---|---|---|
RoutedEvent | RoutedEvent 類型 | 要監聽的事件(比如 Button.ClickEvent ) |
SourceName | string (可選) | 指定事件來源控件的名字(通常用于模板中) |
Actions | 集合(TriggerAction ) | 事件觸發時要執行的動作,通常是開始動畫(BeginStoryboard ) |
- RoutedEvent:必填!指定要監聽哪個路由事件。
<!--當按鈕被點擊時觸發。-->
<EventTrigger RoutedEvent="Button.Click">
-
SourceName:(可選)指定事件來源控件的名字
-
如果要監聽的事件是來自模板中另一個控件,需要指定它的
x:Name
。 -
通常用在
ControlTemplate
或DataTemplate
內。
-
<!--監聽名為 `InnerBorder` 的元素的鼠標進入事件。-->
<EventTrigger RoutedEvent="MouseEnter" SourceName="InnerBorder">
- Actions:當事件發生時執行的動作。
BeginStoryboard
:開始一個動畫StopStoryboard
:停止一個動畫PauseStoryboard
:暫停動畫ResumeStoryboard
:恢復動畫
<!--當事件觸發時,執行透明度變化動畫。-->
<BeginStoryboard><Storyboard><DoubleAnimation Storyboard.TargetProperty="Opacity" To="0.5" Duration="0:0:0.3"/></Storyboard>
</BeginStoryboard>
4. MultiTrigger
—— 多屬性同時滿足觸發
例子:按鈕被禁用(IsEnabled = False
)且鼠標懸停時,背景變灰:
<Button Content="多條件觸發按鈕" IsEnabled="False"><Button.Style><Style TargetType="Button"><Style.Triggers><MultiTrigger><MultiTrigger.Conditions><Condition Property="IsMouseOver" Value="True"/><Condition Property="IsEnabled" Value="False"/></MultiTrigger.Conditions><Setter Property="Background" Value="Gray"/></MultiTrigger></Style.Triggers></Style></Button.Style>
</Button>
? 效果:按鈕同時滿足兩種狀態,才改變樣式。
相關屬性
屬性/子元素 | 類型 | 說明 |
---|---|---|
Conditions | 集合(Condition ) | 定義多個條件,必須全部同時滿足才觸發 |
Setters | 集合(Setter ) | 滿足條件后要改變的屬性 |
EnterActions (可選) | 集合(TriggerAction ) | 進入觸發狀態時執行的動作(如動畫) |
ExitActions (可選) | 集合(TriggerAction ) | 離開觸發狀態時執行的動作 |
使用小技巧 | 說明 |
---|---|
盡量用 Style 包裹觸發器 | 讓界面更整潔、好維護 |
配合 ControlTemplate | 自定義控件外觀時,觸發器更強大 |
用 Storyboard 讓觸發更有動效 | 比如漸變色、放大縮小動畫 |