一、Triggers 触发响应
Triggers让控件对指定的设置具有响应,如下的3种类型都具有triggers collection:Style:设置控件的样式,对应为Style.TriggersControlTemplate:设置控件的模板(可将其设置在Style内部),对应为ControlTemplate.TriggersDataTemplate:数据模板,对应为DataTemplate.Triggers
Triggers主要作为Style和ControlTemplate的一个属性来进行设置,该属性的类型为TriggerCollection,它是抽象类TriggerBase的一个集合。Triggers共有5种触发类型,如下图所示:
二、以Style.Triggers 触发类型为例,其它两种类似
- Trigger类型
Property只能为属性值,不能为事件Value设置具体的值Setter当满足该属性值时触发项内容
<Style x:Key="BtnStyle01" TargetType="{x:Type Button}">
<Style.Triggers>
<Trigger Property="IsPressed" Value="True">
<Setter Property="FontStyle" Value="Italic"/>
</Trigger>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Foreground" Value="Red"/>
</Trigger>
</Style.Triggers>
</Style>
- MultiTrigger类型
Conditions:为设置的条件属性,在此为满足设置的多个条件就可以触发对应的设置。- 当
Button的字体和字形都满足条件时,字体就会变成红色
<Style x:Key="BtnStyle02" TargetType="Button">
<Style.Triggers>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="FontSize" Value="20"/>
<Condition Property="FontFamily" Value="Times New Roman"/>
</MultiTrigger.Conditions>
<Setter Property="Foreground" Value="Red"/>
</MultiTrigger>
</Style.Triggers>
</Style>
- EventTrigger类型
RoutedEvent为主要的属性,用来设置触发的具体事件,其值只能为事件类型Actions为接下来为具体的响应事件,一般为动画
<Style x:Key="BtnStyle03" TargetType="Button">
<Style.Triggers>
<EventTrigger RoutedEvent="Click">
<BeginStoryboard>
<Storyboard>
<DoubleAnimation Storyboard.TargetProperty="FontSize" From="10" To="40"
Duration="0:0:2" RepeatBehavior="3x" FillBehavior="Stop"/>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
<EventTrigger RoutedEvent="MouseEnter">
<BeginStoryboard>
<Storyboard>
<DoubleAnimation Storyboard.TargetProperty="Opacity" From="1.0" To="0.2"
Duration="0:0:2" AutoReverse="True" RepeatBehavior="3x" FillBehavior="Stop"/>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Style.Triggers>
</Style>
- DataTrigger类型和MultiDataTrigger类型
- 当绑定的数据满足指定条件时,就会触发一些响应
DataTrigger和MultiDataTrigger的区别在于:满足条件的数量,前者只能设置一个条件,而后者可以设置多个条件。- 如下,当
ListBox绑定的数据中某些属性满足指定的值时,就会以不同的颜色或背景来进行显示:
using System.Collections.ObjectModel;
//自定义绑定的数据类型
namespace Pr24_Style.SubItem
{
public class MyData
{
public string CityName { set; get; }
public string CurState { set; get; }
public MyData(string str1, string str2)
{
CityName = str1;
CurState = str2;
}
}
public class PlacesData : ObservableCollection<MyData>
{
public PlacesData()
{
Add(new MyData("BeiJing", "On"));
Add(new MyData("ShangHai", "Off"));
Add(new MyData("GuangZhou", "No"));
Add(new MyData("HangZhou", "On"));
Add(new MyData("NanJin", "To"));
Add(new MyData("Shenzhen", "On"));
}
}
}
<!--资源文件-->
<local:PlacesData x:Key="placesData"/>
<Style x:Key="lsty" TargetType="ListBoxItem">
<Style.Triggers>
<DataTrigger Binding="{Binding Path=CurState}" Value="On"> <!--当CurState值为On时,会触发响应-->
<Setter Property="Foreground" Value="Red"/>
</DataTrigger>
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding Path=CityName}" Value="ShangHai"/>
<Condition Binding="{Binding Path=CurState}" Value="Off"/>
</MultiDataTrigger.Conditions>
<Setter Property="Background" Value="Violet"/>
</MultiDataTrigger>
</Style.Triggers>
</Style>
<!--设置数据显示的样式-->
<DataTemplate DataType="{x:Type local:MyData}">
<Canvas Width="160" Height="20">
<TextBlock Canvas.Left="0" Width="130" FontSize="12" Text="{Binding Path=CityName}"/>
<TextBlock Canvas.Left="130" Width="30" FontSize="12" Text="{Binding Path=CurState}"/>
</Canvas>
</DataTemplate>
<!--创建ListBox应用实例,来对资源文件进行调用-->
<ListBox HorizontalAlignment="Center" Width="180" Background="Honeydew"
ItemsSource="{Binding Source={StaticResource placesData}}" ItemContainerStyle="{StaticResource lsty}"/>
结果如下:

本文探讨了Windows界面控件的五种触发类型(Style.Triggers, ControlTemplate.Triggers, DataTemplate.Triggers, EventTrigger, DataTrigger/MultiDataTrigger),展示了如何通过属性值、事件和数据绑定定制控件样式和行为。通过实例解析了MultiTrigger和DataTrigger的使用,揭示了如何根据数据状态实现动态样式调整。
307

被折叠的 条评论
为什么被折叠?



