触发器有三种类型:
·属性触发器Property Trigger:当Dependency Property的值发生改变时触发。
·数据触发器Data Trigger:当普通.NET属性的值发生改变时触发。
·事件触发器Event Trigger:当路由时间被触发时调用。
1.属性触发器(Property Trigger)
属性触发器是WPF中最常用的触发器类型,因为我们前边说过依赖属性具有垂直变更通知的功能,所以在使用属性触发器时会很方便,而且因为WPF中每个控件超过2/3的属性都是依赖属性,所以它用到的场合更多。属性触发器是在当某个依赖属性的值发生变化时触发执行一个Setter的集合,当属性失去这个值时,这些被处罚执行的Setter集合会自动被撤销。
例如,下边的例子设置了当鼠标放置于按钮之上悬停时,按钮的外表会发生变化。注意,属性触发器是用Trigger标识的。
属性触发器还经常被用在做数据验证时用来显示验证错误信息。在WPF学习之绑定里的Validation部分我们附有用属性触发器来判断是否有验证错误并显示相应验证错误信息的示例。
….. |
---|
2.数据触发器Data Trigger
数据触发器和属性触发器除了面对的对象类型不一样外完全相同。数据触发器是来检测非依赖属性———也就是用户自定义的.NET属性——-的值发生变化时来触发并调用符合条件的一系列Setter集合。
下边的示例演示了在绑定的ListBox里如果某个User对象符合某种特点(Role=Admin),则以突出方式显示这个对象。这里就用了DataTrigger,因为我们需要检测的是User对象的属性Role,这个对象是自定义的非可视化对象并且其属性为普通.NET属性。
… |
---|
主要的部分定义在了Style中,其针对的是每个ListBox的项,当其被绑定的数据的属性Role为Admin时,突出显示:
3.事件触发器Event Trigger
事件触发器,顾名思义是在某个事件被触发时来调用这个触发器的相关操作。因为WPF提供了用XAML来标记对象,事件等,所以其提供了一些在普通.NET开发中看似没用的属性例如IsMouseOver, IsPressed等,这是为了XAML来用的,使其可以很方便的通过某个属性来判断状态,也方便了Property Trigger的应用。而作为事件触发器来说,它所做的事情和Property Trigger类似,不过是它的内部不能是简单的Setter集合,而必须是TriggerAction的实例。
以下示例演示了如何应用Event Trigger当鼠标点击按钮时,让按钮的阴影效果发生变化。
Click Me to Animate Drop Shadow! From=”50,50,50,50”To=”0,0,50,50”AutoReverse=”True” /> Storyboard.TargetProperty=”ShadowDepth” From=”0”To=”30”Duration=”0:0:0.5” AutoReverse=”True” /> Storyboard.TargetProperty=”Softness” From=”0”To=”1”Duration=”0:0:0.5” AutoReverse=”True” /> |
---|
4.MultiDataTrigger & MultiTrigger
截至目前我们讨论的都是针对单个条件的触发器,也就是说当某一个条件满足时就会触发。而现实中我们可能需要满足很多个条件时才触发一系列操作,这个时候就需要用到MultiDataTrigger或MultiTrigger。MutliDataTrigger和MultiTrigger都具有一个Conditions集合用来存放一些触发条件,这里的Condition之间是and的关系,当所有条件都满足时,Setter集合才会被调用。根据名字就可以看清楚:MultiDataTrigger用来实现多个数据触发器(只用于普通.NET属性)满足条件时调用;MultiTrigger用来实现多个属性触发器(用于依赖属性)满足条件时调用。
以下示例仅当按钮的IsEenabled属性为true,并且可见时(Visibility=Visible)会以醒目的方式显示,否则当IsEnabled属性为false时将以灰色显示。
… |
---|
给按钮添加单击事件用来改变IsEnabled属性:
privatevoidButton_Click(objectsender,RoutedEventArgse) { this.btnVisible.IsEnabled = !this.btnVisible.IsEnabled; } |
---|
看看效果(左边为不单击后不满足条件时的样式):
同样的,你也可以用MultiDataTrigger来对自定义的属性进行多条件的与关系操作。
5.在触发器中执行用户代码
DependencyProperty.RegisterAttached方法允许用户给控件/窗体等定义自己的依赖属性,其包含的CallBack参数可以允许执行某个特定方法。这允许我们在Trigger中去调用特定的事件处理。其实严格的说这和Trigger不太有关系,因为这相当于我们给某个对象添加了自定义属性并执行某些事件。但trigger可以恰恰利用这个好处来简介的执行业务逻辑:
publicstaticreadonlyDependencyPropertySomethingHappenedProperty =DependencyProperty.RegisterAttached(“SomethingHappened”,typeof(bool),typeof(Window1),newPropertyMetadata(false,newPropertyChangedCallback(SomethingHappened))); publicboolGetSomethingHappened(DependencyObjectd) { return(bool)d.GetValue(SomethingHappenedProperty); } publicvoidSetSomethingHappened(DependencyObjectd,boolvalue) { d.SetValue(SomethingHappenedProperty, value); } publicstaticvoidSomethingHappened(DependencyObjectd,DependencyPropertyChangedEventArgse) { //do something here } |
---|