WPF中的触发器——Trigger

发布时间 2023-09-30 16:38:22作者: Aatrox1

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>`