作者: 邓崇富

撰写时间: 2019 年 6 月 27 日

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

使用触发器,可以动态地更改控件的外观,因为一些事件或属性值该变了。例如,用户把鼠标移到按钮上,按钮就会改变其外观。通常,这必须在C#代码中实现。使用WPF,也可以用XAML实现,而这会影响UI。

XAML有几个触发器。属性触发器在属性值改变时激活。多触发器基于多个属性值。事件触发器在事件发生时激活。数据触发器在绑定的数据改变时激活。

属性触发器:

Style类有一个Trigger属性,通过它可以指定属性触发器。下面的示例将一个Button元素放在一个Grid面板中,利用Window资源定义Button元素的默认样式。这样式指定,将Background属性设置为LigthBlue,将FontSisze属性设置为17.这是应用程序启动时Button元素的样式。使用触发器可以改变控件的样式。触发器在Style.Trigger元素中应用Trigger元素定义。将一个触发器赋予IsMouseOver属性,另一个触发器赋予IsPressed属性。这两个属性通过应用了样式的Button类定义。如果IsMouseOver属性的值是True,就会激活触发器,将Foreground属性设置为Red,将FontSize属性设置为22。如果按下该按钮,,IsPressed属性就是true,激活第二个触发器,并将TextBox的Foreground属性设置为Yellow。

详细代码如下:

<!-- 窗口样式-->

< Window.Resources >

< Style TargetType ="Button">

< Setter Property ="Background" Value ="LightBlue"/>

< Setter Property ="FontSize" Value ="17"/>

<!-- 触发器-->

< Style.Triggers >

<!-- 鼠标移到按钮上的触发事件-->

< Trigger Property ="IsMouseOver" Value ="True">

< Setter Property ="Foreground" Value ="Red"/>

< Setter Property ="FontSize" Value ="22"/>

</ Trigger >

<!-- 鼠标按下按钮时的触发事件-->

< Trigger Property ="IsPressed" Value ="True">

< Setter Property ="Foreground" Value ="Yellow"/>

< Setter Property ="FontSize" Value ="22"/>

</ Trigger >

</ Style.Triggers >

</ Style >

</ Window.Resources >

<!-- 按钮-->

< Button Width ="200" Height ="30" Content =" 点我!"/>

</ Grid >

效果如下图:

当激活触发器的原因不再有效时,就不必将属性值重置为原始值。例如,不必定义IsMouseOver =true和IsMouseOver = false的触发器。只要激活触发器的原因不再有效,触发器操作进行的修改就会自动重置为原始值。

Trigger类定义了下面表中的属性,以指定触发器操作。

Trigger属性

说明

Property  value

使用属性触发器,Property和Value属性用于指定触发器的激活时间,例如,Property="IsMouseOver" Value="True"

Setters

一旦激活触发器,就可以使用Setters元素集合,来改变属性值,Setter类定义Property.TargetName和Value属性,已修改对象属性

EnterActions ExitActions

除了定义Setters之外,还可以定义EnterActions和ExitActions。使用这两个属性,可以定义一个TargetName元素集合. EnterActions在启动触发器时激活(此时通过属性触发器应用Property/Value组合)。ExitActions在触发器激活结束之前激活(此时不再应用Property/Value组合),用这些操作指定的触发器操作派生自基类TriggerAction,如SoundPlayerAction和BeginStoryboard。使用SoundPlayerAction基类可以开始播放声音,BeginStoryboard基类用于动画。

多触发器:

属性的值变化时,就会激活属性触发器,如果因为两个或多个属性有特定的值,而需要设置触发器,就可以使用MultiTrigger。

MultiTrigger有一个Conditions属性,可以在其中设置属性的有效值。它还有一个Setters属性,可以其中指定需要设置的属性。在下面的示例中,给TextBox元素定义了一个样式,如果IsEnabled属性是True,Text属性的值是Test,就应用触发器。如果应用这两个触发器,就把TextBox的Foreground属性设置为Red:

<!-- 窗口样式-->

< Window.Resources >

< Style TargetType ="TextBox">

< Setter Property ="Margin" Value ="15"/>

< Style.Triggers >

< MultiTrigger >

< MultiTrigger.Conditions >

< Condition Property ="IsEnabled" Value ="True"/>

< Condition Property ="Text" Value ="Test"/>

</ MultiTrigger.Conditions >

< MultiTrigger.Setters >

< Setter Property ="Foreground" Value ="Red"/>

</ MultiTrigger.Setters >

</ MultiTrigger >

</ Style.Triggers >

</ Style >

</ Window.Resources >

<!-- 按钮-->

< TextBox />

</ Grid >

数据触发器:
如果绑定到控件上的数据满足制定条件,就激活数据触发器。下面的例子使用Book类,Book类定义Title和Publisher属性,还重载ToString()方法:

public class Book

public string Title { get ; set ; }

public string Publisher { get ; set ; }

public override string ToString()

return Title;

在XAML代码中,给ListBoxItem元素指定了一个样式。改样式包含DataTrigger元素,它绑定到用于列表项的类的 Publisher 属性上。如果Publisher属性的值是Wrox Press,Background就设置为Red。把Background分别设置为Yellow和LightBlue:

<!-- 窗口样式-->

< Window.Resources >

< Style TargetType ="ListBoxItem">

< Style.Triggers >

< DataTrigger Binding ="{ Binding Publisher }" Value ="Wrox Press">

< Setter Property ="Background" Value ="Red"/>

</ DataTrigger >

< DataTrigger Binding ="{ Binding Publisher }" Value ="Dummies">

< Setter Property ="Background" Value ="Yellow"/>

</ DataTrigger >

< DataTrigger Binding ="{ Binding Publisher }" Value ="Wiley">

< Setter Property ="Background" Value ="DarkGray"/>

</ DataTrigger >

</ Style.Triggers >

</ Style >

</ Window.Resources >

<!-- 界面-->

< ListBox x : Name ="list1"/>

</ Grid >

在XAML的后台代码中,把列表list1初始化为包含几个Book对象:

public partial class MainWindow : Window

public MainWindow()

InitializeComponent();

list1.Items.Add( new Book

Title = "professional C# 4.0 and .NET 4" ,Publisher = "Wrox Press"

list1.Items.Add( new Book

Title = "C# 2019 for Dummies" ,

Publisher = "For Dummies"

list1.Items.Add( new Book

Title = "HTML and CSS:Design and Buid Websites" ,

Publisher = "Wiley"

运行应用程序后,ListBoxItem元素就会根据 Publisher 的值进行格式化,如下图:

使用DataTrigger时,必须给MultiDataTrigger设置多个属性(类似于Trigger和MultiTrigger)。

Represents a trigger that applies property values or performs actions when the bound data meets a specified condition. 某词典的翻译: 当绑定的数据满足指定的条件时,应用(指定的)属性或执行操作的 触发器 下面我演示一... 今天在做一个小Demo的时候碰到了一个比较奇怪的问题,就是其 一个 Trigger 始终无法执行,< Trigger Property="Popup.IsOpen" Value="False">就是当Popup控件关闭的时候不能触发<Setter TargetName="BG" Property="Background" Value="Gray" />这个状态,首先贴一下... 刚接触WPF不久,很多地方都还不了解。这个问题困扰了我有些日子了,今天终于找到了解决的办法。希望能帮到有需要的人。 开始用 Trigger 的时候觉得很麻烦,尤其是想设置其他控件的属性时,总是提示 Trigger s下必须是Event Trigger 或者说不能设置TargetName属性之类的。 我想做一个 触发器 ,目的是改变某个控件的Visibility属性。弄了半天都不行,最后只能用笨方法,给那个控件 Style 直译过来就是“风格”、“样式”。是通过改变一些属性值的搭配来 实现的。如果把WPF窗体看做一个舞台,那么窗体上的控件就是一个个演 员,它们的职责就是在用户界面上按照业务逻辑的需要扮演自己的角色。为了让同一种 控件能担当起不同的角色,程序员就要为它们设计多种外观样式和行为动作,这就是 Style。构成Style最重要的两种元素是Setter和 Trigger ,Setter类帮助我们设置控件的静态 外观风格, Trigger 类则帮助我们设置控件的行为风格。 Style 的Setter Setter,设置 3、由数据触发的Data Trigger 程序 经常会遇到基于数据执行某些判断情况,遇到这种情况时我们可以考虑使用 Data Trigger 。Data Trigger 对象的Binding属性会把数据源源不断送过来,一旦送来的值与Value属性一致,Data Trigger 即被触发。 下面例子 ,当TextBox的Text长度小于7个字符时其Border会保持红色。 XAML 代码如下: 这个例子 唯一需要解释的就是 资源是可以在应用程序的不同位置重用的对象。 XAML 资源的示例包括画笔和样式。每个 框架级别的元素(FrameworkElement或FrameworkContentElement)都有一个resource属 性,该属性包含资源定义的资源(作为ResourceDictionary)。可以在任何元素上定义资 源,但是资源通常是在根元素上定义的。当在页面根元素上定义一个资源时,页面逻辑 树 的所有元素都可以访问它,并且您可以重用相同的资源来设置接受该资源表示的类 型的任何属性的值 初学WPF,知道一些控件,可以通过定义Style的 Trigger 改变要显示的样式,但是经常遇到一些明明 Trigger 已经触发了,但是里面Setter设置的样式,却没有效果的问题。其实主要原因,是样式重复定义导致的。 举个例子: <i:Interaction. Trigger s> <i:Event Trigger EventName=“MouseEnter”> <i:InvokeCommandAction Command="{Binding MouseEnterCommand}"/> </i:Event Trigger > </i:Interaction. Trigger s> <TextBlock FontSize 利用 WPF 的 Trigger 系统,也可以很简单的只使用xmal实现三态按钮。在Window或UserControl的资源 声明按钮的style并加入触发功能。使用的时候直接在button里复写style就可以了,废话不多说,直接上代码:<UserControl.Resources> <Style x:Key="threeStateButton" Targe... 1 使用附加属性来添加动画 public static readonly DependencyProperty AniInvokePropery = DependencyProperty.RegisterAttached("AniInvoke", t... WPF 有种叫做 触发器 的东西(记住不是数据库的 trigger 哦)。它的主要作用是根据 trigger 的不同条件来自动更改外观属性,或者执行动画等操作。 WPF trigger 的主要类型有: Trigger 、Multi Trigger 、Data Trigger 、MultiData Trigger 、Event Trigger 几种。从字面意思上我们想大家已经知道个大概,接下来我将还会用实例代码逐一进行介绍。trig 今天上班时候 写一个很简单的事件触发事件,发现mousedown 事件死活触发不了。 后面找了一下原因, 原来坑爹的跟书写的顺序有关系, 如果 mouse down 写在第一个,就只能触发mouse move 不能触发 down 只能按顺序, 先写move 再写down 才能按照顺序触发。 不知道是不是微软的一个bug。 正确的做法就是把顺序交换一下