触发器,应用属性值或有条件地执行操做;
1)触发源:控件;
2)触发条件:某属性为某个值,或执行某个事件时;
3)执行操做:更改某个属性值或执行某个事件;
4)举例:当窗口加载时(执行某个事件时),以动画的形式将窗口的大小倍数从 0 到 1 展现(执行某个事件)。动画
1)根据触发器的触发条件,在 WPF 中,触发器的形态能够是:Trigger、DataTrigger、EventTrigger;
2)以及由 Trigger 延伸的 MultiTrigger 和由 DataTrigger 延伸的 MultiDataTrigger;spa
Trigger 主要用于监测依赖项属性的变化,而后使用设置器改变样式code
// 例子1: <Button Foreground="Red" Width="350" Content="效果"> <Button.Style> <Style TargetType="{x:Type Button}"> <Setter Property="Height" Value="200"/> <Style.Triggers> <!--触发条件:当焦点属性的值为 True 时--> <Trigger Property="IsFocused" Value="True"> <!--使用设置器更改样式--> <Setter Property="Height" Value="300"/> </Trigger> </Style.Triggers> </Style> </Button.Style> </Button> // 例子2: <Button Foreground="Red" Width="350" Content="效果"> <Button.Style> <Style TargetType="{x:Type Button}"> <Style.Triggers> <Trigger Property="IsFocused" Value="True"> <Setter Property="Background" Value="Blue"></Setter> <Trigger.EnterActions> <!--启动动画并将动画分发给目标对象和属性--> <BeginStoryboard> <Storyboard> <DoubleAnimation Storyboard.TargetProperty="Width" To="500" Duration="0:0:4"/> </Storyboard> </BeginStoryboard> </Trigger.EnterActions> </Trigger> </Style.Triggers> </Style> </Button.Style> </Button>
跟 Trigger相似,只是它能够绑定到任意数据的变化对象
<Button Foreground="Red" Width="350" Content="效果"> <Button.Style> <Style TargetType="{x:Type Button}"> <Style.Triggers> <!--触发条件:当 name 值为 bt 的控件的焦点属性值为 True 时--> <DataTrigger Binding="{Binding IsFocused, ElementName=bt}" Value="True"> <Setter Property="Background" Value="Blue"></Setter> <DataTrigger.EnterActions> <!--一样的,启动动画并将动画分发给目标对象和属性--> <BeginStoryboard> <Storyboard> <DoubleAnimation Storyboard.TargetProperty="Width" From="100" To="500" Duration="0:0:4"/> </Storyboard> </BeginStoryboard> </DataTrigger.EnterActions> </DataTrigger> </Style.Triggers> </Style> </Button.Style> </Button>
表示应用设置事件以响应操做的触发器,窗口加载时执行动画就是用 EventTrigger 实现的;blog
<Button> <Button.Style> <Style TargetType="{x:Type Button}"> <Style.Triggers> <!--事件触发器:当 window 加载时,触发--> <EventTrigger RoutedEvent="Window.Loaded"> <EventTrigger.Actions> <!--一样的,启动动画并将动画分发给目标对象和属性--> <BeginStoryboard> <Storyboard> <DoubleAnimation Storyboard.TargetProperty="Width" From="0" To="100" Duration="0:0:0.2"/> </Storyboard> </BeginStoryboard> </EventTrigger.Actions> </EventTrigger> </Style.Triggers> </Style> </Button.Style> </Button>
Trigger 相似。联合了多个条件,只有知足了全部这些条件,才会启动触发器。事件
<Button> <Button.Style> <Style TargetType="{x:Type Button}"> <Style.Triggers> <MultiTrigger> <!--当 Content、IsMouseOver 这两个属性为设置的值时,才会触发该触发器--> <MultiTrigger.Conditions> <Condition Property="Content" Value="效果"></Condition> <Condition Property="IsMouseOver" Value="True"></Condition> </MultiTrigger.Conditions> <MultiTrigger.Setters> <Setter Property="Foreground" Value="Red"></Setter> </MultiTrigger.Setters> </MultiTrigger> <Style.Triggers> <Style TargetType="{x:Type Button}"> <Button.Style> <Button>
MultiDataTrigger 能够参考 DataTrigger 和 MultiTrigger 便可。get
..it
像上面,能够往 Style.Trigger 里添加 Trigger、DataTrigger、EventTrigger,
但只能往控件里面的 Triggers 添加 EventTrigger:io
<Button> <Button.Triggers> <EventTrigger RoutedEvent="Window.Loaded"> <EventTrigger.Actions> <BeginStoryboard> <Storyboard> <DoubleAnimation Storyboard.TargetProperty="Width" From="0" To="100" Duration="0:0:0.2"/> </Storyboard> </BeginStoryboard> </EventTrigger.Actions> </EventTrigger> </Button.Triggers> </Button>
在控件标签中,已对控件设置过该属性的值。
具体解释:class
style 是应用样式给控件,它的优先级低于直接对控件操做的设置,例如:
<Button Width="350" Content="效果"> <Button.Style> <Style TargetType="{x:Type Button}"> <Style.Triggers> <Trigger Property="IsFocused" Value="True"> <!--Button 自己已经对 Width 设置过值,这里的触发器不会生效--> <Setter Property="Width" Value="100"/> </Trigger> </Style.Triggers> </Style> </Button.Style> </Button>
Trigger 、 DataTrigger 能够是 EnterActions、ExitActions,
EnterActions 是触发对象变为活动状态时,通俗来讲,就是当该属性的值成为你设置的值时,开始触发器执行,强调的是成为的瞬间;
而 ExitActions 是反过来,当触发对象变为非活动状态时,即当该属性的值从你设置的值到别的值,这个瞬间,开始触发器执行。
而 EventTrigger 的是 Actions,它的时机在发生事件时。
这个能够根据他们的触发条件,慢慢体会体会,先学会用。