Trigger是实现动态效果的途径之一
有Trigger(属性触发器)、MultiTrigger(多属性触发器)、DataTrigger(数据触发器)、MultiDataTrigger(多数据触发器)、EventTrigger(事件触发器)。
1 Trigger(属性触发器)
例:
<ControlTemplate.Triggers>
<Trigger Property="IsPositive" Value="False">
<Setter TargetName="EditBox" Property="Foreground" Value="Red"/>
</Trigger>
</ControlTemplate.Triggers>
使用要求
后台控件中
public static readonly DependencyProperty IsPositiveProperty =
DependencyProperty.Register("IsPositive",
typeof(bool),
typeof(NumericUpDown));
public bool IsPositive
{
get
{
return (bool)this.GetValue(IsPositiveProperty);
}
set
{
base.SetValue(IsPositiveProperty, value);
}
}
(1)要声明静态的DependencyProperty,注册到指定的属性
(2)我理解:属性的值是放在前台层,所以属性值获取变动都要引用DependencyProperty来实现,否则不会引发前台的动态效果。
(3)触发的时候,直接使用该属性获取或设置
2 MultiTrigger(多属性触发器)
MultiTrigger 类:表示一个应用属性值或一组条件同时满足时执行操作的触发器。
Conditions(条件)属性:
设置 Condition 对象的集合。 对属性更改时满足所有集合中的条件时应用。
<MultiTrigger>
<MultiTrigger.conditions>
//触发条件
</MultiTrigger.conditions>
//这个位置写你想要的效果,动画等等
</MultiTrigger>
Setters属性:
设置一组 Setter 对象,描述要应用当满足指定的条件的操作。
<Style.Triggers>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="IsPressed" Value="true"/>
<Condition Property="Height" Value="50"/>
</MultiTrigger.Conditions>
<Setter>
.......
</Setter>
</MultiTrigger>
</Style.Triggers>
3 DataTrigger(数据触发器)
DataTrigger 类:它会在绑定数据满足指定条件时应用属性值或执行操作。
Binding属性:
获取或设置产生数据对象的属性值的绑定。
Value属性:
设置判断该属性是否等于该值,若等于执行setters操作
<Style TargetType="ListBoxItem">
<Style.Triggers>
<DataTrigger Binding="{Binding Path=State}" Value="WA">
<Setter Property="Foreground" Value="Red" />
</DataTrigger>
</Style.Triggers>
</Style>
Setters属性:
设置一组 Setter 对象,描述要应用当满足指定的条件的操作。
EnterActions属性:
获取要在触发器对象变为活动状态时应用的 TriggerAction 对象的集合。
ExitActions属性:
获取要在触发器对象变为非活动状态时应用的 TriggerAction 对象的集合。
DataTrigger普通用法:
4 MultiDataTrigger(多数据触发器)
MultiDataTrigger 类:表示一个应用属性值或绑定的数据同时满足一组条件时执行操作的触发器。
Conditions属性:
获取 Condition 对象的集合。 对属性值更改时满足所有集合中的条件时应用。
Setters属性:
获取一套 Setter 对象,描述的属性值时要应用的条件的所有 MultiTrigger 满足。
<Window.Resources>
<c:Places x:Key="PlacesData"/>
<Style TargetType="ListBoxItem">
<Style.Triggers>
<DataTrigger Binding="{Binding Path=State}" Value="WA">
<Setter Property="Foreground" Value="Red" />
</DataTrigger>
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding Path=Name}" Value="Portland" />
<Condition Binding="{Binding Path=State}" Value="OR" />
</MultiDataTrigger.Conditions>
<Setter Property="Background" Value="Cyan" />
</MultiDataTrigger>
</Style.Triggers>
</Style>
<StackPanel>
<TextBlock FontSize="18" Margin="5" FontWeight="Bold"
HorizontalAlignment="Center">Data Trigger Sample</TextBlock>
<ListBox Width="180" HorizontalAlignment="Center" Background="Honeydew"
ItemsSource="{Binding Source={StaticResource PlacesData}}"/>
</StackPanel>
5 EventTrigger(事件触发器)
EventTrigger 类:表示一个触发器,该触发器应用一组操作以响应一个事件。
RoutedEvent属性:
获取或设置将激活该触发器的 RoutedEvent。
SourceName属性:
获取或设置对象的名称,该对象具有激活此触发器的事件。 仅元素触发器或模板触发器可使用此名称。
Actions属性:
获取事件发生时要应用的操作的集合。
EnterActions属性:
获取要在触发器对象变为活动状态时应用的 TriggerAction 对象的集合。
ExitActions属性:
获取要在触发器对象变为非活动状态时应用的 TriggerAction 对象的集合。
EventTrigger普通用法:
<Style TargetType="Rectangle">
<Setter Property="Width" Value="50" />
<Setter Property="Height" Value="50" />
<Setter Property="Margin" Value="20" />
<Setter Property="HorizontalAlignment" Value="Left" />
<Style.Triggers>
<EventTrigger RoutedEvent="MouseEnter">
<BeginStoryboard>
<Storyboard>
<DoubleAnimation To="300" Duration="0:0:1.5"
AccelerationRatio="0.10" DecelerationRatio="0.25"
Storyboard.TargetProperty="(Canvas.Width)" />
</Storyboard>
</BeginStoryboard>
</EventTrigger>
<EventTrigger RoutedEvent="MouseLeave">
<BeginStoryboard>
<Storyboard>
<DoubleAnimation Duration="0:0:1.5"
AccelerationRatio="0.10" DecelerationRatio="0.25"
Storyboard.TargetProperty="(Canvas.Width)" />
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Style.Triggers>
</Style>