自定义Trigger并关联到Action

    

  
  之前写过一篇文章,关于自定义Behaviors,通过它,我们在Blend中可以快速的实现各种行为并方便使用。当然,结合blend的开发中,我们还知道xaml中还有另外几个重要的属性,其实在上篇文章中,我们也看到过它们,那就是Triggers和Actions,它们也位于
System.Windows.InteractivityMicrosoft.Expression.Interactions 命名空间下面。接下来,我们来看看如何在blend中使用它们并自定义Trigger且关联到相应的Action上。

     一、关于Triggers和Actions

     作为开发人员,对于这些属性可能用的不多,也不习惯使用,我也是一样,在开发中很少使用它们,这原因也有很多,其中最重要的一点是长期以来,大家都习惯了直接在visual studio这个强大的IDE下进行编码,像Triggers和Actions能实现的东西完全可以用事件,方法等取代之。在这里,我只是给大家扩展下思路:Triggers和Actions还可以这样使用。再说,既然微软给我们提供了Blend这个工具,我们也得适应结合它与vs协同开发的新思维,其中一个很大的优势就是大大提高开发的效率。但是,任何东西都有两面性的,我这里也不是让你一定要这样,这完全取决于你在实际工作中的需要。好了,接下来,我们来看看,Triggers和Actions的基本概念:

  •     Triggers(触发器)正如其名字,通过它,在特定的时候,可以引发一系列的动作。在blend下,存在着EventTrigger, TimerTrigger, StoryBoardCompletedTrigger, KeyTrigger等等。

  •    Actions(动作):它和之前的Behavior有点类似,在blend中你也可以看到,其实它们一并被归为行为。至于概念,也没什么好解释的,它的名字已经非常形象了。默认主要存在了ChangePropertyAction, ControlStoryBoardAction, PlaySoundAction等动作。



     一般来说,Triggers和Actions是一起使用的,举个例子,我们在一个EventTrigger中使用PropertyChangeAction(这个动作用来改变元素的属性),当一个特定的事件被触发的时候,将会执行这个动作,来改变元素的属性。当然,在Triggers中,你可以定义多个Actions以响应不同的动作。


一些注意事项:不是任何时候都适合使用Actions和Triggers的,在官方文档中有这么一段话:

Silverlight 支持对元素使用 EventTriggerobject.Triggers 属性元素,但建议不要对目前的应用程序使用此方法。EventTrigger 可能只对 Loaded 事件支持一个触发操作(您可以在 EventTrigger.RoutedEvent 属性中为此触发事件命名)。这使得 EventTrigger 技术不适合大多数运行时交互。此时不使用 EventTriggerTriggers 属性,而是考虑以下两种备选方法之一:

  • 要对不属于控件的对象的属性进行动画处理,请将演示图板放在页面或应用程序的常规 Resources 中。然后在放置"Triggers"的元素上分配一个事件处理程序。响应相关事件时,该事件处理程序应从资源字典中检索演示图板。然后,您对检索到的 Storyboard 调用 Begin。此技术的另一个好处是相同的演示图板可以应用于多个用户的交互。

  • 要对属于控件的对象的属性进行动画处理(派生自 Control),请使用 VisualStateManager 技术,并通过调用 GoToState 基于控件的状态或输入信息运行适当的动画。


二、一个使用trigger和Action的例子

打开blend,新建一个Silverlight项目




我们在画板上拖拽一个矩形



接下来,我们打开Assets(资产)项下的行为面板,从里面拖拽一个ChangePropertyAction到矩形上面



我们看下这样产生了什么代码:



我们选择ChangePropertyAction,查看它的属性


接着,我们继续修改这里面的属性,实现当事件触发的时候,矩形的长度增长到200,并在4秒的时间内带有Easy out的缓冲动画效果:



接着,运行项目,你就可以看到结果了,确实很简单。接下来,我们就来实现一个自定义的Trigger来关联到一个Action上面。


三、自定义Trigger

这里,我们要实现一个MyKeyDown的Trigger,我们右击项目名称,添加新项:



确定后,自动会打开新创建的类文件,我们发现,它继承了位于System.Windows.Interactivity空间下的TriggerBase<T>类,和自定义Behavior类似,它也有两个重载的方法
OnAttachedOnDetaching在前者中,我们主要是插入要在将 Trigger 附加到对象时运行的代码。在后者,主要是插入要在从对象中删除 Trigger 时运行的代码。接下来,我们分别在它们里面增加如下所示的代码:



在上面的代码中,其中最重要的是,
为了将 Trigger触发,您必须调用 InvokeActions方法。调用 InvokeActions之后,将会通知与此 Trigger关联的任何 Actions运行。接下来生成下项目。我们在之前的项目上继续修改,再打开[ChangePropertyAction]的属性面板,我们将自定义的Trigger关联进去:



确定后,我们能在属性面板那边找到一个keys属性,我们在里面写入AB


这样,再就成功的把一个自定义的trigger关联到了一个Action上,这和普通的keydown事件不同,由于我们对里面的key进行了过滤,所以现在,只有当你按下A或者B键的时候,才会引发Action,其它的按键是无效的。

原文地址:https://www.cnblogs.com/vimsk/p/1963669.html