Triggers — 触发响应

一、Triggers 触发响应

  1. Triggers 让控件对指定的设置具有响应,如下的3种类型都具有triggers collection
    • Style:设置控件的样式,对应为Style.Triggers
    • ControlTemplate:设置控件的模板(可将其设置在Style内部),对应为ControlTemplate.Triggers
    • DataTemplate:数据模板,对应为DataTemplate.Triggers
  2. Triggers 主要作为StyleControlTemplate的一个属性来进行设置,该属性的类型为TriggerCollection,它是抽象类TriggerBase的一个集合。
  3. Triggers 共有5种触发类型,如下图所示:
    在这里插入图片描述

二、以Style.Triggers 触发类型为例,其它两种类似

  1. 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>
  1. 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>
  1. 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>
  1. DataTrigger类型和MultiDataTrigger类型
    • 当绑定的数据满足指定条件时,就会触发一些响应
    • DataTriggerMultiDataTrigger的区别在于:满足条件的数量,前者只能设置一个条件,而后者可以设置多个条件。
    • 如下,当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}"/>

结果如下:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值