trigger主要運用的場景在Style、ControlTemplate、DataTemplate三個地方。在這些地方可以使用trigger,具體視情況而定。
1.屬性觸發器(Property Trigger)
一般用於自身Dependency Property的值發生改變時觸發
2.數據觸發器(DataTrigger)
Trigger都是專對於控件自身的依賴屬性(dependency properties)。DataTrigger是一般專對於另的控件的屬性,而且都是用綁定來實現的。
倆種用法
第一種:-支持Binding
<Style TargetType="Border">`
<Style.Triggers>
`<DataTrigger Binding="{Binding WindowState,RelativeSource={RelativeSource AncestorType=Window}}" Value="Normal">`
`<Setter Property="CornerRadius" Value="0,8,0,0"/>`
`</DataTrigger>`
`<DataTrigger Binding="{Binding WindowState,RelativeSource={RelativeSource AncestorType=Window}}" Value="Maximized">`
`<Setter Property="CornerRadius" Value="0"/>`
`</DataTrigger>`
</Style.Triggers>
`</Style>`
第二種:
`<Style TargetType="{x:Type ListBoxItem}">`
<Style.Triggers>
`<DataTrigger Binding="{Binding Path=Role}" Value="Admin">`
`<Setter Property="Foreground" Value="Red" />`
`</DataTrigger>`
</Style.Triggers>
</Style>
3.事件觸發器(EventTrigger)
Eventtrigger一般用於動畫效果的處理。上面倆個觸發器作用對象都是屬性。而這個卻是作用於事件的。表示當前某個事件發生後要觸發。
一般配合動畫使用,它的內部不能是簡單的Setter集合,而必須是TriggerAction的實例。
`<Grid>`
`<Button Margin="15" Width="200" Name="myButton">`
Click Me to Animate Drop Shadow!
<Button.BitmapEffect>
`<DropShadowBitmapEffect x:Name="myDropShadowBitmapEffect" Color="Black" ShadowDepth="0" />`
</Button.BitmapEffect>
<Button.Triggers>
`<EventTrigger RoutedEvent="Button.Click">`
`<BeginStoryboard>`
`<Storyboard>`
`<ThicknessAnimation Storyboard.TargetProperty="Margin" Duration="0:0:0.5"
From="50,50,50,50" To="0,0,50,50" AutoReverse="True" />`
`<DoubleAnimation Storyboard.TargetName="myDropShadowBitmapEffect"
Storyboard.TargetProperty="ShadowDepth"
From="0" To="30" Duration="0:0:0.5" AutoReverse="True" />`
`<DoubleAnimation Storyboard.TargetName="myDropShadowBitmapEffect"
Storyboard.TargetProperty="Softness"
From="0" To="1" Duration="0:0:0.5" AutoReverse="True" />`
`</Storyboard>`
`</BeginStoryboard>`
`</EventTrigger>`
</Button.Triggers>
`</Button>`
`</Grid>`
--多條件觸發器(MultiDataTrigger)
上面的觸發器應該來講算是比較簡單而又常用。可是都是單個觸發條件。我們在編寫業務代碼的時候,往往可以存在多個條件下的觸發效果。所以上面的Trigger和DataTrigger就不能滿足需求了。爲了這種情況,WPF爲Trigger提供了MultiTrigger,爲DataTrigger提供了MultiDataTrigger。除了語法上有一定的區別以外,效果是一樣子的。
`<TextBlock Text="I am Aomi" Width="75" Height="20">`
<TextBlock.Style>
`<Style TargetType="TextBlock">`
<Style.Triggers>
`<MultiTrigger>`
<MultiTrigger.Conditions>
`<Condition Property="IsEnabled" Value="True" />`
`<Condition Property="IsMouseOver" Value="True" />`
</MultiTrigger.Conditions>
`<Setter Property="Background" Value="#4d4d4d" />`
`</MultiTrigger>`
</Style.Triggers>
`</Style>`
</TextBlock.Style>
`</TextBlock>`
MultiDataTrigger的用法
`<TextBlock Text="I am Aomi" Width="75" Height="20">`
<TextBlock.Style>
`<Style TargetType="TextBlock">`
<Style.Triggers>
`<MultiDataTrigger>`
<MultiDataTrigger.Conditions>
`<Condition Binding="{Binding IsChecked,ElementName=Changer }" Value="True" />`
`<Condition Binding="{Binding IsMouseOver,RelativeSource={RelativeSource Self} }" Value="True" />`
</MultiDataTrigger.Conditions>
`<Setter Property="Foreground" Value="Red" />`
`</MultiDataTrigger>`
</Style.Triggers>
`</Style>`
</TextBlock.Style>
`</TextBlock>`