天天看点

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

Windows Workflow Foundation之旅(二)——指南1(构造一个顺序工作流)

翻译自 ms-help://MS.WinWF.v1.EN/WinWF_GettingStarted/html/9c3e5551-4eff-4977-89ac-f81ab092d996.htm

   顺序工作流(sequentialworkflow)是为执行一种由一系列预定义的步骤组成的任务而设计的。这种体系结构是模拟基于过程的应用程序的。这一节将用几个步骤来编写一个简单的开支报告程序,这个小程序使用WinFrom做界面,用顺序工作流做业务逻辑。  这个小程序有一个TextBox来输入开支报告的总数,一个Button点击提交报告。工作流将评估开支,如果开支小于1000则提请领班审批,如果大于等于1000则提请经理审批。之后,工作流会发送一个审批意见,此时,出现一个Label显示审批意见,两个Button分别表示通过和拒绝审批。当某一个按钮被点击的时候,应用程序会通知回应工作流,工作流继续处理发生的事件。   开始构造顺序工作流   创建工作流类   WWF SDK中定义了一个SequentialWorkFlow类,我们定义一个ExpenseRoportWorkflow类,并继 承自SequentialWorkflow,这样就创建一个顺序工作流。如:

   1

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

using  System;

 2

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

using  System.Workflow.Activities;

 3

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

using  System.Workflow.Activities.Rules;

 4

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

 5

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

namespace  Microsoft.Samples.Workflow.Quickstarts.SequentialWorkflow

 6

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)
Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)
Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

{

 7

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

    [RuleConditionsAttribute(typeof(Microsoft.Samples.Workflow.Quickstarts.SequentialWorkflow.ExpenseReportWorkflow))]

 8

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

    public sealed partial class ExpenseReportWorkflow : System.Workflow.Activities.SequentialWorkflow

 9

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)
Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)
Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

{

10

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

        public ExpenseReportWorkflow()

11

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)
Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)
Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

{

12

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

13

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

        }

14

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

    }

15

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

}

16

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

    声明工作流参数    在一个工作流运行时,它可以从宿主应用程序中接收参数。参数是ParameterDeclaration类型的对象,一旦工作流初始化完成,参数的值就能通过工作流的Parameters集合来访问。  这里的开始报告程序用了两个参数。第一个参数是开支的总数;第二个是一个传出参数,用来放置审批意见。  定义一个新的方法InitializeComponent,并在构造ExpenseRoportWorkflow类的构造函数中调用它。一下的例子示范了怎样定义两个参数并把它们加到Parameters集合中。

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)
Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

 1

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

public ExpenseReportWorkflow()

 2

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

 3

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)
Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)
Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

{

 4

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

 5

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

    InitializeComponent();

 6

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

 7

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

}

 8

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

 9

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

10

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

11

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

private void InitializeComponent()

12

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

13

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)
Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)
Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

{

14

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

15

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

    System.Workflow.ComponentModel.ParameterDeclaration Amount = new System.Workflow.ComponentModel.ParameterDeclaration();

16

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

17

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

    System.Workflow.ComponentModel.ParameterDeclaration Result = new System.Workflow.ComponentModel.ParameterDeclaration();

18

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

19

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

    //

20

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

21

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

    // Workflow Parameters

22

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

23

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

    //

24

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

25

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

    Amount.Direction = System.Workflow.ComponentModel.ParameterDirection.In;

26

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

27

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

    Amount.Name = "Amount";

28

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

29

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

    Amount.Type = typeof(int);

30

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

31

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

    Amount.Value = null;

32

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

33

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

    Result.Direction = System.Workflow.ComponentModel.ParameterDirection.Out;

34

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

35

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

    Result.Name = "Result";

36

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

37

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

    Result.Type = typeof(string);

38

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

39

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

    Result.Value = null;

40

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

41

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

    this.Parameters.Add(Amount);

42

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

43

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

    this.Parameters.Add(Result);

44

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

45

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

}

46

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

47

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

  使用IfElse活动    IfElse活动用条件表达式来控制工作流中流程的运行。工作流将根据条件表达式的结果来决定执行条件分支(IfElseBranch)中的哪一个活动。  例子中将使用IfElse活动。通过判断从宿主应用程序中传入的Amount参数的值是否小于1000,来决定是否将审报发送到领班,否则发送到经理。   创建IfElse活动  1.定义4个私有变量

类型 名称
IfElse evaluateExpenseReportAmount
IfElseBranch ifNeedsLeadApproval
IfElseBranch elseNeedsManagerApproval
CodeCondition ifElseLogicStatement

 2.在InitializeComponent中用默认构造函数实例以上4个对象。  以下的代码示例了怎样创建IfElse活动,并用IfElseBranch活动联系两个逻辑分支。你需要把以下代码放到InitializeComponent方法底部。

   1

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

//  

 2

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

 3

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

//  EvaluateExpenseReportAmount

 4

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

 5

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

// 

 6

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

 7

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

this.EvaluateExpenseReportAmount.Activities.Add(this .ifNeedsLeadApproval);

 8

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

 9

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

this.EvaluateExpenseReportAmount.Activities.Add(this .elseNeedsManagerApproval);

10

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

11

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

this.EvaluateExpenseReportAmount.ID = "EvaluateExpenseReportAmount" ;

12

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

13

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

//  

14

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

15

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

//  ifNeedsLeadApproval

16

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

17

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

// 

18

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

19

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

this.ifNeedsLeadApproval.Activities.Add(this .invokeGetLeadApproval);

20

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

21

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

ifElseLogicStatement.Condition += new System.Workflow.Activities.ConditionalExpression(this .DetermineApprovalContact);

22

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

23

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

this.ifNeedsLeadApproval.Condition =  ifElseLogicStatement;

24

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

25

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

this.ifNeedsLeadApproval.ID = "ifNeedsLeadApproval" ;

26

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

27

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

//  

28

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

29

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

//  elseNeedsManagerApproval

30

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

31

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

// 

32

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

33

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

this.elseNeedsManagerApproval.Activities.Add(this .invokeGetManagerApproval);

34

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

35

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

this.elseNeedsManagerApproval.Condition = null ;

36

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

37

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

this.elseNeedsManagerApproval.ID = "elseNeedsManagerApproval" ;

38

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

   WWF在IfElse活动中,有两种评估条件表达式的方式。一种是RoleCondition,这个对象通过使用一组规则来判断条件表达式的结果;另一种就是使用CodeCondition活动。CodeCondition使用一个回调方法,这个回调方法返回一个代表评估结果的布尔值。上面的例子就是使用CodeCondition来决定条件表达式的值。如果Amount参数小于1000,回调方法返回true,否则返回false。以下的代码就是这个回调函数的定义,你可以把它加到工作流类的定义中。

   1

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

private bool DetermineApprovalContact(object  sender, EventArgs e)

 2

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

 3

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)
Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)
Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

{

 4

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

 5

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

    if ( Convert.ToInt32(this.Parameters["Amount"].Value) < 1000 )

 6

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

 7

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

        return true;

 8

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

 9

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

10

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

11

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

    return false;

12

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

13

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

}

14

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

  构造IfElse分支(IfElseBranch)活动    创建完IfElse活动之后,我们来构造IfElseBranch活动  在这个例子中,每一IfElse活动的分支都使用InvokeMethodActivity活动来通知宿主程序——工作流需要领班或经理的审批才能继续执行。InvokeMethodActivity被设计成调用一个在WWF运行时中的服务接口。我们在同一份代码文件中定义了这个接口。当我们在之后构造宿主程序时,宿主类将实现这个接口,以便能建立工作流和宿主程序的通信(这一段文档上写的很模糊,我reflect后看了源码才明白过来,在最后将补充描述一下)。

    构建IfElseBranch活动  1. 在类中定义两个私有字段

类型 名称
InvokeMethodActivity invokeGetLeadApproval
InvokeMethodActivity invokeGetManagerApproval

 2. 在InitializeComponent中用默认构造函数实例化这两个对象  以下的代码示例了怎样在父活动(IfElse)中创建IfElseBranch活动,并把两个的InvokeMethodActivity联系到对应的IfElseBranch活动上,每个InvokeMethodActivity将调用定义在IExpenseReportService接口中的方法,接口会在稍微实现。你需要把以下代码放到InitializeComponent方法底部。

     1

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

//  

 2

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

 3

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

//  invokeGetLeadApproval

 4

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

 5

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

// 

 6

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

 7

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

this.invokeGetLeadApproval.ID = "invokeGetLeadApproval" ;

 8

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

 9

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

this.invokeGetLeadApproval.InterfaceType = typeof (Microsoft.Samples.Workflow.Quickstarts.SequentialWorkflow.IExpenseReportService);

10

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

11

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

this.invokeGetLeadApproval.MethodName = "GetLeadApproval" ;   

12

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

13

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

//  

14

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

15

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

//  invokeGetManagerApproval

16

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

17

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

// 

18

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

19

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

this.invokeGetManagerApproval.ID = "invokeGetManagerApproval" ;

20

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

21

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

this.invokeGetManagerApproval.InterfaceType = typeof (Microsoft.Samples.Workflow.Quickstarts.SequentialWorkflow.IExpenseReportService);

22

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

23

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

this.invokeGetManagerApproval.MethodName = "GetManagerApproval" ;

24

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

25

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

    以下代码定义了IExpenseReportService接口  1

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

using  System;

 2

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

 3

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

using  System.Workflow.ComponentModel;

 4

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

 5

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

using  System.Workflow.Runtime.Messaging;

 6

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

 7

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

 8

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

 9

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

namespace  Microsoft.Samples.Workflow.Quickstarts.SequentialWorkflow

10

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

11

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)
Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)
Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

{

12

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

13

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

    [DataExchangeService]

14

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

15

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

    public interface IExpenseReportService

16

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

17

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)
Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)
Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

{

18

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

19

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

        void GetLeadApproval();

20

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

21

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

        void GetManagerApproval();

22

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

23

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

        event EventHandler<WorkflowMessageEventArgs> ExpenseReportApproved;

24

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

25

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

        event EventHandler<WorkflowMessageEventArgs> ExpenseReportRejected;

26

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

27

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

    }

28

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

29

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

}

30

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

31

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

  监听宿主事件   在这个阶段,工作流已经从宿主程序接受了两个参数(译者注:其中一个为out参数,此时设为null),评估了Amount参数,作出了到底该提请谁确认审批的决定,并通知了宿主程序在继续接下来的处理之前,确认审批。这里,Listen活动和EventSinkActivity活动往往配合使用,来监听宿主程序触发指定的事件。接着,一个approval或rejection事件被引发,工作流继续执行,返回审批结果Result,并终止流程。 Listen活动的每个分支是一个EventDriven活动。EventDriven活动只能使用实现了IEventActivity接口的活动。Listen活动的每个分支中的EventDriven各有一个EventSinkActivity,它们是用来监听宿主程序触发的ExpenseReportApproved或者ExpenseReportRejected事件的。这种工作流和宿主的通信方法其实类似于之前的InvokeMethodActivity的过程,只不过前者是工作流监听宿主事件,而后者是宿主事件工作流中注册的接口。 我们已经在前面的步骤中,把接口和两个事件的定义都完成了。在这里,我们将创建一个Listen活动并和两个EventDriven分支建立连接。每个分支包含一个EventSinkActivity活动,每个EventSink监听一种对应的事件。此外,我们还将创建一些事件处理程序,来处理AfterInvoke事件(译者注:这里的AfterInvoke事件应为Invoked事件)。这些事件处理程序将会把Result参数的值设为approval或者rejected。   构造监听活动 1.在工作流类中定义5个私有字段

类型 名称
Listen listenApproveReject
EventDriven approveEventDriven
EventDriven rejectEventDriven
EventSinkActivity approveEvent
EventSinkActivity rejectEvent

 2. 在InitializeComponent中实例化。  以下的代码示例了怎样在创建Listen活动和EventSinkActivity活动,来监听宿主程序发出的事件。你需要把以下代码放到InitializeComponent方法底部。 使用EventSinkActivity时,为了在工作流中加入一些附加逻辑,你可以为Invoked事件创建一个事件处理程序。一下是事件处理程序的代码。  1

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

//  

 2

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

 3

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

//  listenApproveReject

 4

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

 5

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

// 

 6

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

 7

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

this.listenApproveReject.Activities.Add(this .approveEventDriven);

 8

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

 9

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

this.listenApproveReject.Activities.Add(this .rejectEventDriven);

10

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

11

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

this.listenApproveReject.ID = "listenApproveReject" ;

12

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

13

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

//  

14

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

15

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

//  approveEventDriven

16

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

17

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

// 

18

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

19

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

this.approveEventDriven.Activities.Add(this .approveEvent);

20

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

21

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

this.approveEventDriven.ID = "approveEventDriven" ;

22

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

23

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

//  

24

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

25

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

//  approveEvent

26

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

27

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

// 

28

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

29

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

this.approveEvent.EventName = "ExpenseReportApproved" ;

30

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

31

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

this.approveEvent.ID = "approveEvent" ;

32

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

33

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

this.approveEvent.InterfaceType = typeof (Microsoft.Samples.Workflow.Quickstarts.SequentialWorkflow.IExpenseReportService);

34

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

35

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

this.approveEvent.Roles = null ;

36

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

37

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

this.approveEvent.Invoked += new System.EventHandler(this .approveEvent_Invoked);

38

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

39

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

//  

40

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

41

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

//  rejectEventDriven

42

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

43

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

// 

44

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

45

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

this.rejectEventDriven.Activities.Add(this .rejectEvent);

46

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

47

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

this.rejectEventDriven.ID = "rejectEventDriven" ;

48

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

49

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

//  

50

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

51

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

//  rejectEvent

52

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

53

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

// 

54

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

55

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

this.rejectEvent.EventName = "ExpenseReportRejected" ;

56

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

57

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

this.rejectEvent.ID = "rejectEvent" ;

58

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

59

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

this.rejectEvent.InterfaceType = typeof (Microsoft.Samples.Workflow.Quickstarts.SequentialWorkflow.IExpenseReportService);

60

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

61

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

this.rejectEvent.Roles = null ;

62

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

63

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

this.rejectEvent.Invoked += new System.EventHandler(this .rejectEvent_Invoked);

64

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

65

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

完成顺序工作流  1

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

private void approveEvent_Invoked(object  sender, EventArgs e)

 2

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

 3

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)
Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)
Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

{

 4

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

 5

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

    this.Parameters["Result"].Value = "Report Approved";

 6

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

 7

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

}

 8

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

 9

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

10

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

11

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

private void rejectEvent_Invoked(object  sender, EventArgs e)

12

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

13

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)
Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)
Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

{

14

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

15

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

    this.Parameters["Result"].Value = "Report Rejected";

16

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

17

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

}

18

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

19

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

    这个工作流包括两个主要的步骤:第一,监听宿主程序的递交审批事件,并把传入的值作为工作流参数;第二,监听通过或拒绝审批消息。一下的代码示例了怎样通过把之前创建好的活动加到工作流活动集中,来完成工作流的构造。  1

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

//  

 2

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

 3

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

//  ExpenseReportWorkflow

 4

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

 5

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

// 

 6

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

 7

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

this.Activities.Add(this .EvaluateExpenseReportAmount);

 8

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

 9

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

this.Activities.Add(this .listenApproveReject);

10

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

11

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

this.DynamicUpdateCondition = null ;

12

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

13

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

this.ID = "ExpenseReportWorkflow" ;

14

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

15

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

  创建宿主程序   WWF需要一个宿主程序来运行工作流。当程序开始运行,WWF运行时引擎也随之启动。而之前构造好的工作流,则到用户点击了Submit按钮后才真正启动。 建立一个新的源文件,取名Program。以下的代码包含了完整的WinForm应用程序。IExpenseReportService接口GetLeadApproval和GetmanagerApproval方法已经定义在另一个文件中。宿主程序实现了这个接口。在approval和rejected按钮的click事件中,将引发ExpenseReprotApproval或ExpenseReprotRejected事件。     1

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

using  System;

  2

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

  3

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

using  System.ComponentModel;

  4

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

  5

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

using  System.Drawing;

  6

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

  7

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

using  System.Windows.Forms;

  8

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

  9

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

using  System.Collections.Generic;

 10

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

 11

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

using  System.Workflow.Runtime;

 12

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

 13

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

using  System.Workflow.Runtime.Hosting;

 14

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

 15

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

using  System.Workflow.Runtime.Messaging;

 16

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

 17

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

 18

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

 19

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

namespace  Microsoft.Samples.Workflow.Quickstarts.SequentialWorkflowHost

 20

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

 21

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)
Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)
Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

{

 22

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

 23

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

    public class MainForm : Form, Microsoft.Samples.Workflow.Quickstarts.SequentialWorkflow.IExpenseReportService

 24

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

 25

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)
Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)
Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

{

 26

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

 27

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

        private System.Windows.Forms.Label label1;

 28

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

 29

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

        private System.Windows.Forms.TextBox result;

 30

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

 31

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

        private System.Windows.Forms.Label label2;

 32

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

 33

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

        private System.Windows.Forms.Button submitButton;

 34

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

 35

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

        private System.Windows.Forms.Label approvalState;

 36

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

 37

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

        private System.Windows.Forms.Button approveButton;

 38

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

 39

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

        private System.Windows.Forms.Button rejectButton;

 40

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

 41

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

        private System.Windows.Forms.TextBox amount;

 42

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

 43

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

        private System.Windows.Forms.Panel panel1;

 44

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

 45

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

 46

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

 47

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

        private System.ComponentModel.IContainer components = null;

 48

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

 49

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

 50

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

 51

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

        private delegate void GetApprovalDelegate();

 52

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

 53

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

        private WorkflowRuntime workflowRuntime = null;

 54

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

 55

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

        private WorkflowInstance workflowInstance = null;

 56

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

 57

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

 58

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

 59

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

        public MainForm()

 60

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

 61

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)
Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)
Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

{

 62

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

 63

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            InitializeComponent();

 64

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

 65

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

 66

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

 67

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            // Collapse approve/reject panel

 68

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

 69

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            this.Height -= this.panel1.Height;

 70

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

 71

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

 72

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

 73

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            workflowRuntime = new WorkflowRuntime();

 74

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

 75

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            workflowRuntime.AddService(this);

 76

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

 77

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            workflowRuntime.StartRuntime();

 78

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

 79

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

 80

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

 81

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            workflowRuntime.WorkflowCompleted += new EventHandler<WorkflowCompletedEventArgs>(workflowRuntime_WorkflowCompleted);

 82

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

 83

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

        }

 84

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

 85

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

 86

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

 87

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

        protected override void Dispose(bool disposing)

 88

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

 89

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)
Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)
Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

{

 90

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

 91

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            if (disposing && (components != null))

 92

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

 93

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)
Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)
Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

{

 94

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

 95

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

                components.Dispose();

 96

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

 97

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            }

 98

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

 99

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            base.Dispose(disposing);

100

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

101

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

        }

102

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

103

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

104

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

105

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

        private void InitializeComponent()

106

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

107

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)
Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)
Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

{

108

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

109

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            this.label1 = new System.Windows.Forms.Label();

110

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

111

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            this.result = new System.Windows.Forms.TextBox();

112

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

113

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            this.label2 = new System.Windows.Forms.Label();

114

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

115

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            this.submitButton = new System.Windows.Forms.Button();

116

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

117

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            this.approvalState = new System.Windows.Forms.Label();

118

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

119

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            this.approveButton = new System.Windows.Forms.Button();

120

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

121

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            this.rejectButton = new System.Windows.Forms.Button();

122

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

123

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            this.amount = new System.Windows.Forms.TextBox();

124

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

125

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            this.panel1 = new System.Windows.Forms.Panel();

126

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

127

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            this.panel1.SuspendLayout();

128

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

129

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            this.SuspendLayout();

130

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

131

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            // 

132

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

133

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            // label1

134

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

135

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            // 

136

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

137

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            this.label1.AutoSize = true;

138

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

139

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            this.label1.Location = new System.Drawing.Point(13, 13);

140

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

141

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            this.label1.Name = "label1";

142

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

143

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            this.label1.Size = new System.Drawing.Size(39, 13);

144

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

145

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            this.label1.TabIndex = 1;

146

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

147

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            this.label1.Text = "Amount";

148

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

149

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            // 

150

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

151

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            // result

152

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

153

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            // 

154

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

155

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            this.result.Location = new System.Drawing.Point(13, 69);

156

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

157

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            this.result.Name = "result";

158

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

159

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            this.result.ReadOnly = true;

160

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

161

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            this.result.Size = new System.Drawing.Size(162, 20);

162

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

163

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            this.result.TabIndex = 1;

164

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

165

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            this.result.TabStop = false;

166

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

167

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            // 

168

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

169

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            // label2

170

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

171

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            // 

172

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

173

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            this.label2.AutoSize = true;

174

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

175

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            this.label2.Location = new System.Drawing.Point(13, 54);

176

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

177

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            this.label2.Name = "label2";

178

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

179

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            this.label2.Size = new System.Drawing.Size(33, 13);

180

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

181

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            this.label2.TabIndex = 3;

182

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

183

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            this.label2.Text = "Result";

184

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

185

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            // 

186

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

187

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            // submitButton

188

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

189

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            // 

190

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

191

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            this.submitButton.Enabled = false;

192

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

193

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            this.submitButton.Location = new System.Drawing.Point(56, 95);

194

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

195

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            this.submitButton.Name = "submitButton";

196

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

197

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            this.submitButton.Size = new System.Drawing.Size(75, 23);

198

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

199

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            this.submitButton.TabIndex = 2;

200

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

201

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            this.submitButton.Text = "Submit";

202

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

203

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            this.submitButton.Click += new System.EventHandler(this.submitButton_Click);

204

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

205

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            // 

206

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

207

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            // approvalState

208

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

209

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            // 

210

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

211

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            this.approvalState.AutoSize = true;

212

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

213

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            this.approvalState.Location = new System.Drawing.Point(10, 9);

214

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

215

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            this.approvalState.Name = "approvalState";

216

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

217

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            this.approvalState.Size = new System.Drawing.Size(45, 13);

218

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

219

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            this.approvalState.TabIndex = 4;

220

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

221

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            this.approvalState.Text = "Approval";

222

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

223

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            // 

224

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

225

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            // approveButton

226

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

227

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            // 

228

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

229

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            this.approveButton.Enabled = false;

230

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

231

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            this.approveButton.Location = new System.Drawing.Point(11, 25);

232

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

233

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            this.approveButton.Name = "approveButton";

234

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

235

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            this.approveButton.Size = new System.Drawing.Size(75, 23);

236

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

237

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            this.approveButton.TabIndex = 0;

238

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

239

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            this.approveButton.Text = "Approve";

240

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

241

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            this.approveButton.Click += new System.EventHandler(this.approveButton_Click);

242

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

243

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            // 

244

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

245

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            // rejectButton

246

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

247

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            // 

248

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

249

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            this.rejectButton.Enabled = false;

250

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

251

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            this.rejectButton.Location = new System.Drawing.Point(86, 25);

252

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

253

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            this.rejectButton.Name = "rejectButton";

254

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

255

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            this.rejectButton.Size = new System.Drawing.Size(75, 23);

256

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

257

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            this.rejectButton.TabIndex = 1;

258

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

259

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            this.rejectButton.Text = "Reject";

260

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

261

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            this.rejectButton.Click += new System.EventHandler(this.rejectButton_Click);

262

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

263

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            // 

264

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

265

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            // amount

266

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

267

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            // 

268

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

269

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            this.amount.Location = new System.Drawing.Point(13, 29);

270

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

271

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            this.amount.MaxLength = 9;

272

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

273

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            this.amount.Name = "amount";

274

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

275

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            this.amount.Size = new System.Drawing.Size(162, 20);

276

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

277

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            this.amount.TabIndex = 0;

278

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

279

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            this.amount.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.amount_KeyPress);

280

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

281

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            this.amount.TextChanged += new System.EventHandler(this.amount_TextChanged);

282

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

283

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            // 

284

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

285

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            // panel1

286

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

287

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            // 

288

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

289

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            this.panel1.Controls.Add(this.approvalState);

290

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

291

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            this.panel1.Controls.Add(this.approveButton);

292

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

293

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            this.panel1.Controls.Add(this.rejectButton);

294

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

295

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            this.panel1.Location = new System.Drawing.Point(3, 124);

296

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

297

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            this.panel1.Name = "panel1";

298

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

299

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            this.panel1.Size = new System.Drawing.Size(172, 66);

300

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

301

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            this.panel1.TabIndex = 8;

302

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

303

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            // 

304

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

305

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            // MainForm

306

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

307

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            // 

308

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

309

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            this.AcceptButton = this.submitButton;

310

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

311

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);

312

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

313

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;

314

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

315

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            this.ClientSize = new System.Drawing.Size(187, 201);

316

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

317

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            this.Controls.Add(this.panel1);

318

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

319

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            this.Controls.Add(this.amount);

320

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

321

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            this.Controls.Add(this.submitButton);

322

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

323

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            this.Controls.Add(this.label2);

324

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

325

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            this.Controls.Add(this.result);

326

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

327

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            this.Controls.Add(this.label1);

328

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

329

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.Fixed3D;

330

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

331

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            this.MaximizeBox = false;

332

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

333

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            this.MinimizeBox = false;

334

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

335

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            this.Name = "MainForm";

336

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

337

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            this.Text = "Simple Expense Report";

338

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

339

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            this.panel1.ResumeLayout(false);

340

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

341

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            this.panel1.PerformLayout();

342

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

343

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            this.ResumeLayout(false);

344

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

345

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            this.PerformLayout();

346

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

347

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

348

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

349

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

        }

350

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

351

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

352

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

353

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

        private void submitButton_Click(object sender, EventArgs e)

354

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

355

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)
Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)
Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

{

356

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

357

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            Type type = typeof(Microsoft.Samples.Workflow.Quickstarts.SequentialWorkflow.ExpenseReportWorkflow);

358

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

359

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

360

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

361

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            // Construct workflow parameters

362

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

363

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            Dictionary<string, object> properties = new Dictionary<string, object>();

364

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

365

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            properties.Add("Amount", Int32.Parse(this.amount.Text));

366

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

367

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            properties.Add("Result", string.Empty);

368

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

369

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

370

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

371

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            // Start the workflow

372

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

373

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            workflowInstance = workflowRuntime.StartWorkflow(type, properties);

374

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

375

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

        }

376

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

377

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

378

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

379

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

        void workflowRuntime_WorkflowCompleted(object sender, WorkflowCompletedEventArgs e)

380

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

381

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)
Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)
Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

{

382

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

383

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            if (this.result.InvokeRequired)

384

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

385

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

                this.result.Invoke(new EventHandler<WorkflowCompletedEventArgs>(this.workflowRuntime_WorkflowCompleted), sender, e);

386

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

387

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            else

388

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

389

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)
Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)
Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

{

390

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

391

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

                this.result.Text = e.OutputParameters["Result"].ToString();

392

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

393

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

394

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

395

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

                // Clear fields

396

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

397

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

                this.amount.Text = string.Empty;

398

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

399

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

400

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

401

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

                // Disable buttons

402

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

403

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

                this.approveButton.Enabled = false;

404

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

405

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

                this.rejectButton.Enabled = false;

406

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

407

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            }

408

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

409

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

        }

410

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

411

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

412

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

413

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

        private void approveButton_Click(object sender, EventArgs e)

414

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

415

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)
Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)
Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

{

416

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

417

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            // Raise the ExpenseReportApproved event back to the workflow

418

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

419

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            ExpenseReportApproved(null, new WorkflowMessageEventArgs(this.workflowInstance.InstanceId));

420

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

421

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            this.Height -= this.panel1.Height;

422

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

423

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            this.submitButton.Enabled = true;

424

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

425

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

        }

426

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

427

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

428

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

429

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

        private void rejectButton_Click(object sender, EventArgs e)

430

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

431

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)
Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)
Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

{

432

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

433

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            // Raise the ExpenseReportRejected event back to the workflow

434

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

435

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            ExpenseReportRejected(null, new WorkflowMessageEventArgs(this.workflowInstance.InstanceId));

436

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

437

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            this.Height -= this.panel1.Height;

438

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

439

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            this.submitButton.Enabled = true;

440

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

441

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

        }

442

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

443

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

444

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

445

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)
Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

        IExpenseReportService Members#region IExpenseReportService Members

446

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

447

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

448

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

449

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

        public void GetLeadApproval()

450

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

451

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)
Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)
Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

{

452

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

453

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            if (this.approvalState.InvokeRequired)

454

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

455

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

                this.approvalState.Invoke(new GetApprovalDelegate(this.GetLeadApproval));

456

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

457

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            else

458

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

459

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)
Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)
Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

{

460

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

461

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

                this.approvalState.Text = "Lead approval needed";

462

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

463

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

                this.approveButton.Enabled = true;

464

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

465

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

                this.rejectButton.Enabled = true;

466

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

467

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

468

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

469

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

                // expand the panel

470

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

471

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

                this.Height += this.panel1.Height;

472

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

473

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

                this.submitButton.Enabled = false;

474

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

475

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            }

476

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

477

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

        }

478

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

479

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

480

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

481

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

        public void GetManagerApproval()

482

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

483

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)
Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)
Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

{

484

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

485

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            if (this.approvalState.InvokeRequired)

486

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

487

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

                this.approvalState.Invoke(new GetApprovalDelegate(this.GetManagerApproval));

488

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

489

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            else

490

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

491

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)
Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)
Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

{

492

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

493

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

                this.approvalState.Text = "Manager approval needed";

494

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

495

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

                this.approveButton.Enabled = true;

496

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

497

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

                this.rejectButton.Enabled = true;

498

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

499

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

500

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

501

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

                // expand the panel

502

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

503

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

                this.Height += this.panel1.Height;

504

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

505

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

                this.submitButton.Enabled = false;

506

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

507

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            }

508

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

509

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

        }

510

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

511

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

512

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

513

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

        public event EventHandler<WorkflowMessageEventArgs> ExpenseReportApproved;

514

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

515

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

        public event EventHandler<WorkflowMessageEventArgs> ExpenseReportRejected;

516

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

517

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

518

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

519

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

        #endregion

520

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

521

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

522

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

523

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

        private void amount_KeyPress(object sender, KeyPressEventArgs e)

524

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

525

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)
Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)
Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

{

526

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

527

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            if (!Char.IsControl(e.KeyChar) && (!Char.IsDigit(e.KeyChar)))

528

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

529

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

                e.KeyChar = Char.MinValue;            

530

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

531

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

        }

532

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

533

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

534

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

535

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

        private void amount_TextChanged(object sender, EventArgs e)

536

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

537

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)
Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)
Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

{

538

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

539

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            submitButton.Enabled = amount.Text.Length > 0;

540

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

541

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

        }

542

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

543

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

    }

544

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

545

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

546

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

547

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

    static class Program

548

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

549

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)
Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)
Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

{

550

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

551

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)
Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

        /// <summary>

552

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

553

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

        /// The main entry point for the application.

554

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

555

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

        /// </summary>

556

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

557

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

        [STAThread]

558

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

559

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

        static void Main()

560

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

561

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)
Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)
Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

{

562

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

563

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            Application.EnableVisualStyles();

564

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

565

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

            Application.Run(new MainForm());

566

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

567

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

        }

568

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

569

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

    }

570

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

571

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

}

572

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

573

Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

Ps:上面还有个问题没有解释清楚,我reflect了一下,看了源码才知道个大概。

那就是IfElseBranch中的InvokeMethodActivity。 InvokeMethodActivity中有一个Type类型的InterfaceType属性,使用时,需要设置这个属性,并把MethodName设为这个接口中的一个方法的名称。运行时,工作流引擎(也就是WorkflowRuntime)将通过反射调用这个接口。 但引擎怎么知道调用接口的哪个实现呢?你看 workflowRuntime = new WorkflowRuntime(); workflowRuntime.AddService(this); workflowRuntime.StartRuntime(); 原来,初始化引擎时,我们已经把实现了这个interface的类型的实例(this)注册到工作流中了。运行时,引擎就遍历所有已经注册的服务,如果实现了这个接口,这调用它。

继续阅读