代码改变世界

使用工作流标记

2007-02-28 11:12  Windie Chai  阅读(...)  评论(...编辑  收藏

 MSDN原文: http://msdn2.microsoft.com/en-us/library/ms735921.aspx 

    Windows Workflow Foundation 为设计人员和开发人员提供一种创建工作流的途径:通过使用可扩展应用程序标记语言(eXtensible Application Markup Language ,XAML)来创建标记源文件(Markup Source Files). 这些标记文件作为工作流类型在运行时直接被工作流引擎加载.标记文件还可以采用代码分离(使用C#或者VB)的方式被编译成为工作流类型. 这意味着工作流标记文件是否需要被编译,取决于业务上的原因和是否需要实现额外的逻辑. 工作流标记和代码逻辑文件的使用方式类似于ASP.NET中将表现层文件与业务逻辑层文件分离.


    基本结构

    工作流标记的基本结构包括表示工作流类型的根节点和作为根节点子元素的工作流活动. 因为工作流标记基于XAML元素和属性的一个子集,所以它的结构和XAML文件很类似. 例如,工作流中的每个元素都被表示为节点,无论是复合活动还是工作流本身.


    元素和属性

    如上一节所述,工作流标记文件中的每个元素都有其相应的工作流组件. 这些元素的名称就是我们以编程的方式创建工作流时活动的名称. 例如,IfElseActivity 活动被表示为<IfElseActivity> 元素. 自定义活动也是如此.

    活动成员的定义和显示:

     

    <SampleActivity Property1="PropValue" Method="CustomMethod" Event="EventHandlerMethod"/>

     

    XAML 也提供在工作流标记中插入自定义代码的特性:使用 x:Code 定义元素. 注意,代码必须插入到CDATA 节中. 如下面的例子:

     

    <CodeActivity x:Name="codeActivity1" ExecuteCode="methodName1">
      <x:Code><![CDATA[
          void methodName1(object sender, EventArgs e)
          {
          }
      ]]></x:Code>
    </CodeActivity>

     

    提示

    x:Code 元素只能在需要被编译的工作流标记文件中使用.

     

    下表描述了常用的工作流标记属性:

     

    属性

    描述

    x:Array

    类型数组

    x:Class

    工作流类的名称,包含名称空间,工作流类将使用这个名称被编译.

    x:Name

    活动的名称. 对应于 Activity.Name 属性.

    x:Type

    类型引用.

    x:Null

    空值.

    xmlns:x

    XAML架构的名称空间.

    xmlns

    XAML架构的名称空间.


    示例

    下例展示了采用代码分离方式创建的工作流中的标记文件.

     

    <SequentialWorkflowActivity x:Class="XAMLWorkflow.Workflow1" x:Name="Workflow1" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/workflow">
        <IfElseActivity x:Name="ifElseActivity1">
            <IfElseBranchActivity x:Name="ifElseBranchActivity1">
                <IfElseBranchActivity.Condition>
                    <CodeCondition Condition="EvalCondition" />
                </IfElseBranchActivity.Condition>
                <CodeActivity x:Name="codeActivity1" ExecuteCode="codeActivity1_ExecuteCode" />
                <FaultHandlersActivity x:Name="faultHandlersActivity1">
                    <FaultHandlerActivity x:Name="faultHandlerActivity1" Fault="{ActivityBind Workflow1,Path=faultHandlerProp}" FaultType="{x:Type System.NullReferenceException}">
                        <CodeActivity x:Name="codeActivity3" ExecuteCode="codeActivity3_ExecuteCode" />
                    </FaultHandlerActivity>
                </FaultHandlersActivity>
            </IfElseBranchActivity>
            <IfElseBranchActivity x:Name="ifElseBranchActivity2">
                <CodeActivity x:Name="codeActivity2" ExecuteCode="codeActivity2_ExecuteCode" />
            </IfElseBranchActivity>
        </IfElseActivity>
    </SequentialWorkflowActivity>

     

    提示

    如果您采用非编译且只有XAML工作流标记文件的方式来创建工作流,您必须使用ActivityBind 标记扩展来设置类型事件处理器的所有依赖项属性,否则它们将无法在运行时被调用,请看下面的例子:

     

    <CodeActivity x:Name="codeActivity1" ExecuteCode="{ActivityBind Name=Activity12, Path=codeActivity1_ExecuteCode}" />

     

    提示

    如果您采用非编译且只有XAML工作流标记文件的方式来创建工作流, XAML文件中不应该出现x:Class 属性, 这个属性只有在工作流被编译时才有效.