WPF中有种叫做触发器的东西(记住不是数据库的trigger哦)。它的主要作用是根据trigger的不同条件来自动更改外观属性,或者执行动画等操作。

  WPFtrigger的主要类型有:Trigger、MultiTrigger、DataTrigger、MultiDataTrigger、EventTrigger几种。从字面意思上我们想大家已经知道个大概,接下来我将还会用实例代码逐一进行介绍。trigger主要运用的场景在Style、ControlTemplate、DataTemplate三个地方。在这些地方可以使用trigger,具体视情况而定。

  1.在Style中使用各种trigger

  在style中使用的trigger主要是属性的触发器,当属性的值发生改变是将会引发触发器。

  a.普通属性trigger 当鼠标滑过时字体变成红色

<CheckBox Content="Style Trigger MouseOver Red">
            <CheckBox.Resources>
                <Style TargetType="{x:Type CheckBox}">
                    <Setter Property="Foreground"Value="SkyBlue"/>
                    <Style.Triggers>
                        <!--鼠标滑过时字体为红色-->
                        <Trigger Property="IsMouseOver"Value="True">
                            <Setter Property="Foreground"Value="Red"/>
                        </Trigger>
                    </Style.Triggers>
                </Style>
            </CheckBox.Resources>
        </CheckBox>

  b.普通属性MultiTrigger 当checkbox勾选并且鼠标滑过时字体变成绿色

<CheckBox Content="Style MultiTrigger Checked and MouseOver Green ">
            <CheckBox.Resources>
                <Style TargetType="{x:Type CheckBox}">
                    <Setter Property="Foreground"Value="SkyBlue"/>
                    <Style.Triggers>
                        <MultiTrigger>
                            <MultiTrigger.Conditions>
                                <Condition Property="IsChecked"Value="True"/>
                                <Condition Property="IsMouseOver"Value="True"/>
                            </MultiTrigger.Conditions>
                            <Setter Property="Foreground"Value="Green"/>
                        </MultiTrigger>
                    </Style.Triggers>
                </Style>
            </CheckBox.Resources>
        </CheckBox>

  c.EventTrigger 鼠标划入长度变长 鼠标移出 长度变短

<CheckBox Content="Style EventTrigger "Width="70"HorizontalAlignment="Left">
            <CheckBox.Resources>
                <Style TargetType="{x:Type CheckBox}">
                    <Setter Property="Foreground"Value="SkyBlue"/>
                    <Style.Triggers>
                        <EventTrigger RoutedEvent="Mouse.MouseEnter">
                            <EventTrigger.Actions>
                                <BeginStoryboard>
                                    <Storyboard>
                                        <DoubleAnimation
                                          Duration="0:0:0.2"
                                          Storyboard.TargetProperty="Width"
                                          To="150"/>
                                    </Storyboard>
                                </BeginStoryboard>
                            </EventTrigger.Actions>
                        </EventTrigger>
                        <EventTrigger RoutedEvent="Mouse.MouseLeave">
                            <EventTrigger.Actions>
                                <BeginStoryboard>
                                    <Storyboard>
                                        <DoubleAnimation
                                          Duration="0:0:0.2"
                                          Storyboard.TargetProperty="Width"
                                          To="70"/>
                                    </Storyboard>
                                </BeginStoryboard>
                            </EventTrigger.Actions>
                        </EventTrigger>
                    </Style.Triggers>
                </Style>
            </CheckBox.Resources>
        </CheckBox>

  2.在ControlTemplate中使用trigger

  在ControlTemplate中使用的trigger主要是在controltemplate中的元素的触发器,当属性的值发生改变是将会引发触发器。

  属性为“Border” 的鼠标滑过时背景变色,其他的trigger同上面的style一样 这里就不多举例了

<Button Content="ControlTemplate"Width="120"Height="30">
            <Button.Resources>
                <Style TargetType="{x:Type Button}">
                    <Setter Property="Background"Value="Gray"/>
                    <Setter Property="BorderBrush"Value="Black"/>
                    <Setter Property="Cursor"Value="Hand"/>
                    <Setter Property="Template">
                        <Setter.Value>
                            <ControlTemplate TargetType="{x:Type Button}">
                                <StackPanel>
                                    <Border Height="10"Background="Red"></Border>
                                    <Border x:Name="Border"CornerRadius="0"BorderThickness="1"Background="{TemplateBinding Background}"BorderBrush="{TemplateBinding BorderBrush}">
                                        <ContentPresenter VerticalAlignment="Center"HorizontalAlignment="Center"/>
                                    </Border>
                                </StackPanel>
                                
                                <ControlTemplate.Triggers>
                                    <Trigger Property="IsMouseOver"Value="True">
                                        <Setter TargetName="Border"Property="Background"Value="#FFC2E0FF"/>
                                        <Setter TargetName="Border"Property="BorderBrush"Value="#FF3399FF"/>
                                    </Trigger>
                                </ControlTemplate.Triggers>
                            </ControlTemplate>
                        </Setter.Value>
                    </Setter>
                </Style>
            </Button.Resources>
        </Button>

  3.在DataTemplate中使用trigger

  在DataTemplate中使用trigger可以根据绑定的数据不同显示不同的内容。

<TreeView Name="_tree"Margin="0"BorderThickness="0"VerticalAlignment="Stretch"Background="Transparent"ItemsSource="{Binding Children}">
                <TreeView.ItemTemplate>
                    <HierarchicalDataTemplate ItemsSource="{Binding Children}">
                        <Border CornerRadius="0"Margin="1"x:Name="back"MinWidth="70"
                                Background="Transparent"DataContext="{Binding}"PreviewMouseMove="TreeItem_PreviewMouseMove">
                            <StackPanel Orientation="Horizontal"Margin="2">
                                <Image x:Name="BGimage"Source="/Vdc3D.Coms.DModelEditor;component/Images/item.png"Height="15"Width="15"/>
                                <TextBlock Text="{Binding ShowText}"Margin="2 0"/>
                            </StackPanel>
                            <Border.ContextMenu>
                                <ContextMenu x:Name="menu">
                                    <MenuItem Header="Add Directory"x:Name="menu_addDir"Click="AddDir_Click"DataContext="{Binding}"/>
                                    <MenuItem Header="Add Property"x:Name="menu_addChild"Click="AddChild_Click"DataContext="{Binding}"/>
                                    <MenuItem Header="Edit"Click="Modify_Click"DataContext="{Binding}"/>
                                    <MenuItem Header="Delete"Click="Delete_Click"DataContext="{Binding}"/>
                                </ContextMenu>
                            </Border.ContextMenu>
                        </Border>
                        <HierarchicalDataTemplate.Triggers>
                            <MultiDataTrigger>
                                <MultiDataTrigger.Conditions>
                                    <Condition Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type TreeViewItem}},Path=IsExpanded}"Value="False"/>
                                    <Condition Binding="{Binding IsDir}"Value="True"/>
                                </MultiDataTrigger.Conditions>
                                <MultiDataTrigger.Setters>
                                    <Setter TargetName="BGimage"Property="Source"Value="/Vdc3D.Coms.DModelEditor;component/Images/dir.png"/>
                                </MultiDataTrigger.Setters>
                            </MultiDataTrigger>
                            <MultiDataTrigger>
                                <MultiDataTrigger.Conditions>
                                    <Condition Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type TreeViewItem}},Path=IsExpanded}"Value="True"/>
                                    <Condition Binding="{Binding IsDir}"Value="True"/>
                                </MultiDataTrigger.Conditions>
                                <MultiDataTrigger.Setters>
                                    <Setter TargetName="BGimage"Property="Source"Value="/Vdc3D.Coms.DModelEditor;component/Images/dir_open.png"/>
                                </MultiDataTrigger.Setters>
                            </MultiDataTrigger>
                            <DataTrigger Binding="{Binding IsDir}"Value="True">
                                <Setter TargetName="menu_addDir"Property="Visibility"Value="Visible"/>
                                <Setter TargetName="menu_addChild"Property="Visibility"Value="Visible"/>
                            </DataTrigger>
                            <DataTrigger Binding="{Binding IsDir}"Value="False">
                                <Setter TargetName="menu_addDir"Property="Visibility"Value="Collapsed"/>
                                <Setter TargetName="menu_addChild"Property="Visibility"Value="Collapsed"/>
                            </DataTrigger>
                        </HierarchicalDataTemplate.Triggers>
                    </HierarchicalDataTemplate>
                </TreeView.ItemTemplate>
            </TreeView>

  这是一个treeview控件 根据绑定的isdir值不同 可以显示icon是一个目录(文件夹)或者是一个文件,看是不是很简单呢

  以上只是简单的介绍了trigger的一些用法,具体的功能大家可以自由发挥,这也是wpf的强大之处

  本文来自lhx527099095的博客,原文地址:http://blog.csdn.net/lhx527099095/article/details/8029207

WPF触发器(Trigger、DataTrigger、EventTrigger)相关推荐

  1. WPF触发器(Trigger)

    WPF触发器(Trigger.DataTrigger.EventTrigger) WPF中有种叫做触发器的东西(记住不是数据库的trigger哦).它的主要作用是根据trigger的不同条件来自动更改 ...

  2. WPF中的触发器(Trigger)

    这节来讲一下WPF中的触发器--Trigger.触发器,是指在既定条件或者特殊场景下被触发,从而去执行一个操作.在WPF中,触发器可以分为以下几类:基本触发器(Trigger):事件触发器(Event ...

  3. MYSQL_使用外键约束(constraint)或触发器(trigger)来进行级联更新、删除

    我们通常有这样的需求:删除表Table 1中记录,需要同时删除其它表中与Table 1有关的若干记录. 举个例子: 现有2个实体- 麻将机 学生.课程,1种联系- 成绩 分别创建 学生表 studen ...

  4. mysql之触发器trigger

    mysql之触发器trigger 触发器(trigger):监视某种情况,并触发某种操作. 触发器创建语法四要素:1.监视地点(table) 2.监视事件(insert/update/delete)  ...

  5. oracle 数据库 触发器 trigger 语法

    http://shixm.iteye.com/blog/401564 关键字: oracle 数据库 触发器 trigger 语法 语法规则: Create [or replace] trigger ...

  6. SQL入门(3):定义约束/断言assertion/触发器trigger

    本文介绍数据库的完整性 完整性控制程序: 指定规则,检查规则 (规则就是约束条件) 动态约束 intergrity constraint::=(O,P,A,R) O : 数据集合, 约束的对象 ?: ...

  7. android sqlite触发器,SQLite---使用触发器(Trigger)

    背景 当数据库中的数据太多时,往往需要进行清理,将一些过时的数据删除,但是往往找不到合适的时机进行清理.于是SQLite提供了Trigger,当某些事件发生时,可以触发并且进行处理. Trigger ...

  8. MySQL触发器 trigger学习

    触发器:一类特殊的事物.可监视某种数据操作,并触发相关操作(insert/update/delete).表中的某些数据改变,希望同一时候能够引起其他相关数据改变的需求. 作用:变化自己主动完毕某些语句 ...

  9. mysql添加序列触发器_Oracle中使用触发器(trigger)和序列(sequence)模拟实现自增列实例...

    问题:在SQL Server数据库中,有自增列这个字段属性,使用起来也是很方便的.而在Oracle中却没有这个功能,该如何实现呢? 答:在Oracle中虽然没有自增列的说法,但却可以通过触发器(tri ...

  10. mysql insert update 同时执行_MySQL进阶三板斧(三)看清“触发器 (Trigger)”的真实面目

    触发器(Trigger)的起源 MySQL是最受欢迎的开源RDBMS,被社区和企业广泛使用.触发器是MySQL在5.0.1(开天辟地一版本)中增加的三大新功能之一,另外两个师兄弟是视图(view)与存 ...

最新文章

  1. MIT副教授赵宇飞团队登数学四大顶刊,华人作者中两位是本科生,最小的是00后...
  2. OEMAddressTable介绍
  3. [网摘]关于产品运营
  4. 前端学习(3164):react-hello-react之添加todoList
  5. dataframe 如何选中某列的一行_PySpark和SparkSQL基础:如何利用Python编程执行Spark(附代码)
  6. 基础算法 —— 高精度计算 —— 高精度除法
  7. 常用crc查表法_CRC校验码简介及CRC16的计算方法
  8. mvc 前段定义变量_3分钟短文 | Laravel blade模板里优雅地定义PHP变量
  9. Kotlin基础从入门到进阶系列讲解(Android开发) - 总目录
  10. java astar_JAVA-Astar算法实现
  11. f分布表完整图a=0.01_桥梁横向分布系数计算方法及案例详解
  12. Android AIDL 原理解析
  13. conda install 安装慢,或者直接卡死,这么解决
  14. 【云宏大讲坛】超融合,融合的不仅是基础架构
  15. 有感而发20210216
  16. 进口牛羊肉抄码器厂家OCR扫数字重量累加扫码机冷库进出口牛羊肉抄码机进口冻肉抄码设备 进口牛羊肉抄码枪
  17. 【报告分享】2021人工智能行业分析研究报告:投资人角度.pdf(附下载链接)...
  18. ES内部分片处理机制——Segment
  19. 第十一章 认识与学习BASH【鸟哥linux私房菜学习笔记】
  20. 给定一个链表,判断链表中是否有环

热门文章

  1. 【图像融合】基于matlab GUI小波变换彩色图像融合(带面板)【含Matlab源码 782期】
  2. 【数据分析】基于matlab GUI成绩管理系统【含Matlab源码 256期】
  3. 获得学士学位的机器学习工程工作
  4. 对话生成 深度强化学习_通过深度学习与死人对话
  5. 机器学习算法的差异_我们的机器学习算法可放大偏差并永久保留社会差异
  6. linux内核数据链路层,Linux网络内核数据帧的接收进程:数据链路层(概念篇)...
  7. 抖音自动清关注服务器,各位有保留抖音自动关注的代码吗
  8. Chrome插件GitZip(下载github项目中的部分文件)
  9. WebSocket 协议 RFC 文档(全中文翻译) 1
  10. Mac实践--MAC搭建FTP服务器