本文将讲解以下几个活动:Step,Decision,Ronter+Rule
Step:步骤。
Step可以作为其他活动的容器,除了QuickFlow提供的几个活动(Task,GroupTask,Step等),其他活动是不能直接拖到设计器上的,如果要用到其他活动怎么办呢?比如要用CodeActivity来写一下Server Code?这时就可以用Step活动,将Step活动拖到设计器上,就可以在其中添加任意其他活动了。
示意图:
Decision:两路判断。
Decison相当于IfElse,可以按照一个判断条件指定下一步要执行的活动。Decision有两个端点,分别显示F(false),T(True),这两个端点可以划线连接到其他活动,分别为Conditon为True或False时下一步要执行的活动。
Decision有个Condition属性,用来指定判断条件,可以用声明性条件或代码条件,一般在上一步任务结束后需要按照审批结果判断下一步的步骤。这时候就要用到Task活动的TaskOutome属性或GroupTask的TaskOutcomes属性。
如果是按照GroupTask或MultiTask做判断,则需要用类似this.GroupTask1.TaskOutcomes.Filter(“Approve”)>=1来做判断。
如果采用代码条件,代码如下:
private void condition2(object sender, ConditionalEventArgs e)
{
e.Result = this.task1.TaskOutcome == "Approve";
}
Decision只能实现两个下级活动的路由,如果下级活动是多个那么就需要用多个Decision串联。
示意图:
Rounter+Rule:多路判断
这是两个活动,Rounter是一个容器活动,可以在其中添加多个Rule,每个Rule都有一个Condition条件和Target属性,Target指向一个活动,当Contition为True是即执行Target指向的活动。如果下一级审批可能有两种以上的可能性,用这两个活动是非常适合的(当然,也可以用多个Decision连接,但是那样流程图看起来不那么“优美”),Rule的Conditon属性的使用跟Decision的Conditon属性用法完全一样。
但是要注意,Rounter+Rule不能作为一级活动使用,它们必须放置在Step活动内部,一般在用Rounter+Rule时,先拖放一个Step活动,然后在Step活动中添加一个Tas或GroupTask活动,然后添加Rounter活动,Rounter默认会带有两个Rule,实现两路分支判断,可以利用Rounter右键菜单中的Add Branch菜单添加一个Rule。
需要注意的是,就像在这篇文章中提到的:http://www.cnblogs.com/jianyi0115/archive/2009/08/28/1555917.html,有时候,活动的属性值是不能直接取到的,同样,在Rule的Conditon属性中,如果要用到同一个Step中的Task或GroupTask的TaskOutcome或TaskOutcomes属性,在运行时,值也可能取不到的,为了避免这个问题,可以总是把TaskOutcome或TaskOutcomes属性绑定到工作流的一个字段。
代码示例下载:
https://files.cnblogs.com/jianyi0115/QuickFlowExample_StepRounter.rar
注意,请将示例代码中DLL目录中的QuickFlow.dll部署到GAC,或者到codeplex下载最新版本(修复了一个bug)。
后记:Rounter活动路由已经变成一种过期的方式,Quickflow不会再增强这个功能,建议采用其他方式来实现路由,如Decision,RuleDriven,LineRule等。