前言 

因为某个敏感词,一直不想用这个标题,但为了文章的连续性,我就2一回吧,呵呵。

首先,我们来补一上文《创建自定义行为并在Silverlight项目中使用》 中一开始说的在Expression Blend中调用创建的自定义行为,上文只是在Visual Studio中以代码的形式实现了。

打开Silverlight项目【注意:如果你创建的Behaviors是Silverlight的,则只能在Silverlight项目中使用,WPF同样道理】,添加自定义行为的引用,如下图

 

添加完引用后,需要重新编译下项目,以使行为添加到当前的项目中。编译完后,我们打开资产(Asset)面板,会发现自己创建的MyBehavior出现了

我们向美化板中拖一个TextBox以应用MyBehavior,将MyBehavior拖到TextBox上,如下图

导航到属性面板,我们可以设置字体的Foreground为红色或者其他笔刷,运行程序,我们同样的运行结果

本文将讲解TriggerAction及其相关的知识。

什么是TriggerAction?

从字面上就能知道是定义触发器的动作的,这是MSDN解释:

 Describes an action to perform for a trigger

 

在编写继承自TriggerAction的类时,我们不需要像Behavior那样,在OnAttached方法中注册事件,在OnDetaching方法移除事件。TriggerAction假设你想要获取一个事件,需要你做的就是提供一个Invoke方法,该方法将会在事件被触发时被调用

为了让大家更好的理解这个,我们可以查看Expression Blend自带的一些行为的源代码【Expression Blend自带的行为都存在Microsoft.Expression.Interactions.dll中】

我们看一个继承自TriggerAction的比较简单的类---HyperlinkAction,它的类图图下

可以看到它有两个依赖属性及一个Invoke方法,下面我们来看下在Invoke方法中做了些什么事情

在Invoke方法中写了导航的操作,我们再到Expression Blend中操作下,向Button中添加HyperlinkAction,它的属性面板如下,包含触发器、触发条件以及HyperlinkAction自带的属性(在代码中定义的):NavigationUri和TargetWindow【默认为_self】

至于触发器和触发条件都是继承自TriggerAction的,下图是TriggerAction的类图

可以看到TriggerAction类有Invoke方法,也有像Behavior类中的OnAttached方法和OnDetaching方法。以下一张图能更好的说明Expression Blend中默认的事件为Click

本文就不以具体的Demo再写一个继承成TriggerAction的行为了,大家可以参考HyperlinkAction即可,另源代码中有上述涉及到的代码