WPF 杂谈——Trigger触发器

笔者在使用的WPF过程中,见过的触发器有三种:Trigger、DataTrigger、EventTrigger。其中最为常用的要属Trigger。至于触发器的作用就是当某个属性的值发生变化,应该去做某事。当然这是笔者自身的理解。比较简单。那么这三者之间有什么不同呢?这便是这章要讨论的目地。WPF的Style笔者喜欢把他看作CSS的样式。那么Trigger触发器你们可以理解为CSS样式中类似于:hover 伪类。这样子笔者做一个列子吧。如下,当鼠标移动在文本上面的,前景色变成为红色。

<Grid>
        <TextBlock Text="I am Aomi" Width="75" Height="20">
            <TextBlock.Style>
                <Style TargetType="TextBlock">
                    <Style.Triggers>
                        <Trigger Property="IsMouseOver" Value="True">
                            <Setter Property="Foreground" Value="Red" />
                        </Trigger>
                    </Style.Triggers>
                </Style>
            </TextBlock.Style>
        </TextBlock>
</Grid>

执行结果

鼠标移在上面

相信从上面的例子你至少可以明白触发器的作用。而且作用还不小呢?好了。这一点笔者就不需要在重复的去讲解了。那么DataTrigger又跟Trigger有什么区别呢?可以说作用上来讲没有什么区别,但是在面向对象却是不一样子的。Trigger都是专对于控件自身的依赖属性(dependency properties)。DataTrigger是一般专对于另的控件的属性,而且都是用绑定来实现的。如下面的例子。

    <Grid>
        <TextBlock Text="I am Aomi" Width="75" Height="20">
            <TextBlock.Style>
                <Style TargetType="TextBlock">
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding IsMouseOver,RelativeSource={RelativeSource Self}}" Value="True">
                            <Setter Property="Foreground" Value="Red" />
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </TextBlock.Style>
        </TextBlock>
    </Grid>

那么例子的效果跟上一例子一样子。代码上面也没有多大的差别。主要是修改了触发器的写法而以。但是我们要认识到一点:Trigger一般都是跟属性直接关联。而DataTrigger是通过绑定来关联。所以DataTrigger一般用于写另一个控件上的属性在当前控件的触发效果。当然也可以绑定自身,如上。那么在举一个绑定另一个控件的属性吧。如下

<StackPanel Orientation="Vertical">
        <ToggleButton Name="Changer" Content="变红" Width="75" Height="30"></ToggleButton>
        <TextBlock Text="I am Aomi" Width="75" Height="20">
            <TextBlock.Style>
                <Style TargetType="TextBlock">
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding IsChecked, ElementName= Changer}" Value="True">
                            <Setter Property="Foreground" Value="Red" />
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </TextBlock.Style>
        </TextBlock>
    </StackPanel>

执行结果:

最后一个Eventtrigger一般用于动画效果的处理。上面俩个触发器作用对象都是属性。而这个却是作用于事件的。表示当前某个事件发生后要触发。笔者自己写例子太麻烦了。就到国外复制一个例子过来说明。如下

    <StackPanel Orientation="Vertical">
        <TextBlock Text="I am Aomi" HorizontalAlignment="Center">
            <TextBlock.Style>
                <Style TargetType="TextBlock">
                    <Style.Triggers>
                            <EventTrigger RoutedEvent="MouseEnter">
                                <EventTrigger.Actions>
                                    <BeginStoryboard>
                                        <Storyboard>
                                            <DoubleAnimation Duration="0:0:0.300" Storyboard.TargetProperty="FontSize" To="28" />
                                        </Storyboard>
                                    </BeginStoryboard>
                                </EventTrigger.Actions>
                            </EventTrigger>
                            <EventTrigger RoutedEvent="MouseLeave">
                                <EventTrigger.Actions>
                                    <BeginStoryboard>
                                        <Storyboard>
                                            <DoubleAnimation Duration="0:0:0.800" Storyboard.TargetProperty="FontSize" To="18" />
                                        </Storyboard>
                                    </BeginStoryboard>
                                </EventTrigger.Actions>
                            </EventTrigger>
                    </Style.Triggers>
                </Style>
            </TextBlock.Style>
        </TextBlock>
    </StackPanel>

例子的功能很简单就是当鼠标进入到文字区域的时候文字变大到28字体。如果离开就变成18字体。

执行效果:

上面的触发器应该来讲算是比较简单而又常用。可是都是单个触发条件。我们在编写业务代码的时候,往往可以存在多个条件下的触发效果。所以上面的Trigger和DataTrigger就不能满足需求了。为了这种情况,WPF为Trigger提供了MultiTrigger,为DataTrigger提供了MultiDataTrigger。除了语法上有一定的区别以外,效果是一样子的。如下

 <TextBlock Text="I am Aomi" Width="75" Height="20">
            <TextBlock.Style>
                <Style TargetType="TextBlock">
                    <Style.Triggers>
                        <MultiTrigger>
                            <MultiTrigger.Conditions>
                                <Condition Property="IsEnabled" Value="True" />
                                <Condition Property="IsMouseOver" Value="True" />
                            </MultiTrigger.Conditions>
                            <Setter Property="Background" Value="#4d4d4d" />
                        </MultiTrigger>
                    </Style.Triggers>
                </Style>
            </TextBlock.Style>
        </TextBlock>

从上面我们可以看到Condition就是多条件。用法用单条件是一样子的。

执行效果:

最后让我们看一下MultiDataTrigger的用法吧。如下

<TextBlock Text="I am Aomi" Width="75" Height="20">
            <TextBlock.Style>
                <Style TargetType="TextBlock">
                    <Style.Triggers>
                        <MultiDataTrigger>
                            <MultiDataTrigger.Conditions>
                                <Condition Binding="{Binding IsChecked,ElementName=Changer  }" Value="True" />
                                <Condition Binding="{Binding IsMouseOver,RelativeSource={RelativeSource Self} }" Value="True" />
                            </MultiDataTrigger.Conditions>
                            <Setter Property="Foreground" Value="Red" />
                        </MultiDataTrigger>
                    </Style.Triggers>
                </Style>
            </TextBlock.Style>
        </TextBlock>

执行效果:

时间: 2024-10-07 18:12:21

WPF 杂谈——Trigger触发器的相关文章

Trigger 触发器

本文非原创 一.触发器: 是一种特殊的存储过程,其特殊性在于它并不需要用户来执行. 调用,在表中数据进行修改时,自动执行,来实现复杂的完整性约束, 防止对数据不正确的修改. 1.定义:它是一段能够自动执行的程序,当对象进行 update,insert, delete 时,自动执行,它没有参数,不允许被调用. 2.触发器的优点: (1)级联修改 (2)实现复杂约束 (3)检查数据 (4)控制修改表时合乎业务规则 二.触发器的激活时机: 1.后触发:当引起触发器执行的修改语句执行完成,并通过约束后才

WPF 杂谈——开篇简言

这俩年多来笔者一直在从事关于WPF的开发.虽然不能说是专家级别的.但是对于WPF的应用还是有一定的了解.论他的灵活性决对不在WinForm之下.WPF的出现更是引发一段热议.他的何去何从更是让很多人感到迷茫.因为那个时候可以说只有Winow 7才能跟WPF完美的接合.可惜他出不逢时,XP占了大部分的市场.所以WPF的出生动静很大,可惜后力不足,渐渐的淡淡化他的光芒.于至于网络上更是有对WPF的死亡产生了很大的争议.但是这并没有让他沉默下去,这几年来window 8和window 10的推广更是让

WPF 样式(定义样式、引用样式、样式作用域、Trigger触发器)

1.定义 资源字典 <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"   xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">   <RadialGradientBrush x:Key="mybrush">   <GradientStop

杂谈--DML触发器学习

触发器按类型分为三类: 1. DML 触发器,在数据变更时触发: 2. DDL 触发器,在修改数据库级别或实例级别对象时触发: 3. Login 触发器,在用户登录时触发: 最常见的是DML触发器,DML触发器又可以分为两类: INSTEAD OF触发器和AFTER触发器(部分书上有提到FOR触发器,其实就是AFTER 触发器,只是写法不同而已). 从功能来看,INSTEAD OF触发器用来替换实际的数据修改操作,而AFTER触发器用来在实际操作完成后进行后续操作.例如对于DELETE操作,如果

【PLSQL】详解SQL中的trigger(触发器)

本篇主要内容如下: 8.1 触发器类型 8.1.1 DML触发器 8.1.2 替代触发器 8.1.3 系统触发器 8.2 创建触发器 8.2.1 触发器触发次序 8.2.2 创建DML触发器 8.2.3 创建替代(INSTEAD OF)触发器 8.2.3 创建系统事件触发器 8.2.4 系统触发器事件属性 8.2.5 使用触发器谓词 8.2.6 重新编译触发器 8.3 删除和使能触发器 8.4 触发器和数据字典 8.5   数据库触发器的应用举例 触发器是许多关系数据库系统都提供的一项技术.在O

trigger 触发器(mysql)

/* 触发器 tigger 引出触发器: 在进行数据库应用软件的开发的时候,我们有时候会碰到表中的某些数据改变,同事希望引起其他相关数据改变的需求,这时候就需要使用触发器. 运用触发器可以简化程序,增加程序的灵活性 触发器是什么? 触发器是一种特殊的事务,可以监视某种数据操作(增.删.改),并触发相关操作(增.删.改) 触发器应用场景: 订单产生,库存减少 客户消费,积分变化等 触发器的创建语法 四要素: 监视地点(table) 监视事件(insert.update.delete) 触发时间(a

wpf之数据触发器DataTrigger

wpf, 根据绑定的属性的值的不同(数据分类),界面上显示不同的控件(绑定不同类型的属性),可以使用数据库触发器DataTrigger实现这一功能. 实现的效果如下: 首先建立实体类: 更改通知类: public class NotifyPropertyChangedObject : INotifyPropertyChanged { /// <summary> /// 属性更改事件 /// </summary> public event PropertyChangedEventHa

[结]trigger(触发器)摘录

1.触发器: 是许多关系数据库系统都提供的一项技术.在ORACLE系统里,触发器类似过程和函数,都有声明,执行和异常处理过程的PL/SQL块. 触发器在数据库里以独立的对象存储,它与存储过程和函数不同的是,存储过程与函数需要用户显示调用才执行,而触发器是由一个事件来启动运行.即触发器是当某个事件发生时自动地隐式运行.并且,触发器不能接收参数. 2.触发器类型: DML触发器    ORACLE可以在DML语句进行触发,可以在DML操作前或操作后进行触发,并且可以对每个行或语句操作上进行触发.  

WPF 杂谈——资源文件

编写一个应用难免要用到WPF本身的控件.不管是WinForm还是网页都会有自己的控件.只是在写法和用法上有所不同而以.而控件命名却离不开那几个单词.所以不用担心判断不出来哪个是按扭,哪个是文本框.举个例子吧. HTML <input type="button" value="扭按" /> WinForm private System.Windows.Forms.Button button1; WPF <Button Content="按扭