Compartir a través de


Uso del marcado de flujo de trabajo

Windows Workflow Foundation proporciona a los diseñadores y programadores una manera declarativa de crear flujos de trabajo mediante el lenguaje de marcado de aplicaciones eXtensible (XAML) para crear archivos de origen de marcado. Estos archivos de marcado se pueden compilar en un tipo de flujo de trabajo, cargarse directamente en el motor de tiempo de ejecución en el flujo de trabajo en tiempo de ejecución, o se pueden compilar en un tipo de flujo de trabajo con archivos de código subyacente implementados en C# o Visual Basic. Esto significa que los archivos de marcado de flujo de trabajo pueden compilarse o no, según las razones comerciales y si se requiere lógica de implementación adicional. El uso de marcado del flujo de trabajo con archivos lógicos de código subyacente es similar a cómo ASP.NET separa los archivos de presentación de los archivos lógicos.

Para obtener un ejemplo de cómo cargar directamente un archivo de marcado de flujo de trabajo en el motor de tiempo de ejecución del flujo de trabajo, consulte la sección Ejecutar flujos de trabajo, en el tema Creación de una aplicación host de flujo de trabajo.

Además de crear un flujo de trabajo en marcado de flujo de trabajo, puede utilizar también el marcado de flujo de trabajo al conservar su flujo de trabajo con un servicio WorkflowPersistenceService ya que cuando los flujos de trabajo de programación se serializan con WorkflowMarkupSerializer, se convierten en marcado de flujo de trabajo. Para obtener más información, consulte Cómo serializar flujos de trabajo y Servicios de persistencia de Windows Workflow.

Estructura básica

La estructura básica del marcado de flujo de trabajo contiene el nodo raíz, que denota el tipo de flujo de trabajo, seguido por las actividades secundarias en ese flujo de trabajo como subelementos anidados. Dado que el marcado de flujo de trabajo está basado en un subconjunto de elementos y atributos XAML, la estructura de los archivos de marcado de flujo de trabajo es similar a la de un archivo XAML. Por ejemplo, cada elemento en el flujo de trabajo se representa como nod, ya sea de actividades compuestas o del propio flujo de trabajo. La relación entre los nodos se conserva tal como es al crear flujos de trabajo a través de un lenguaje de programación como C# o Visual Basic.

Elementos y atributos

Como se dijo anteriormente, cada elemento en un archivo de marcado de flujo de trabajo corresponde a un componente de flujo de trabajo. Los nombres para esos elementos son los mismos nombres que para los tipos de actividad que se utilizan al crear mediante programación flujos de trabajo. Por ejemplo, la actividad IfElseActivity está representada por el elemento <IfElseActivity>. Esto también es verdad para actividades personalizadas.

Los miembros de actividad se declaran como se muestra en el ejemplo siguiente:

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

XAML también proporciona la capacidad de insertar código de procedimiento dentro de un archivo de marcado de flujo de trabajo utilizando el elemento de directiva x:Code. El código se debe colocar en una sección CDATA para que el compilador pueda compilar el código en lugar de tratarlo como marcado XAML declarativo. El ejemplo siguiente muestra cómo se usa ese elemento con una sección CDATA.

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

Nota

El elemento de directiva x:Code solamente se puede usar en archivos de marcado de flujo de trabajo que están compilados.

La tabla siguiente describe los atributos comunes de marcado del flujo de trabajo.

Atributo Descripción

x:Array

Matriz de tipos.

x:Class

Nombre del flujo de trabajo, incluido el espacio de nombres. Se crea la clase con este nombre cuando el flujo de trabajo está compilado.

x:Name

Nombre de una actividad. Corresponde a la propiedad Activity.Name.

x:Type

Un tipo de referencia.

x:Null

Un valor cero.

xmlns:x

El espacio de nombres para el esquema XAML.

xmlns

El espacio de nombres para el esquema XAML de flujo de trabajo.

Nota

Si utiliza un archivo de marcado de flujo de trabajo no compilado y de solo XAML para crear un flujo de trabajo, el atributo x:Class no debería estar en el archivo XAML. Este atributo sólo es válido cuando el flujo de trabajo se está compilando.

Nota

Si se cambia el espacio de nombres raíz de una aplicación VB después de crearse un archivo de marcado de flujo de trabajo, el atributo x:Class de ese flujo de trabajo también debe actualizarse.

Ejemplo

A continuación se muestra un ejemplo de un archivo de marcado de flujo de trabajo que se utiliza con un archivo de código subyacente que contiene lógica de implementación para varios controladores de eventos en el flujo de trabajo.

<SequentialWorkflowActivity x:Class="XAMLWorkflow.Workflow1" x:Name="Workflow1" xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml" xmlns="https://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>

Debe implementar los controladores de eventos Condition y ExecuteCode antes de que este ejemplo se compile correctamente, como en el ejemplo siguiente:

Private Sub EvalCondition(ByVal sender As Object, ByVal e As ConditionalEventArgs)End Sub
Private Sub codeActivity1_ExecuteCode(ByVal sender As Object, ByVal e As EventArgs)
End Sub
Private Sub codeActivity2_ExecuteCode(ByVal sender As Object, ByVal e As EventArgs)
End Sub
private void EvalCondition(object sender, ConditionalEventArgs e) { }
private void codeActivity1_ExecuteCode(object sender, EventArgs e) { }
private void codeActivity2_ExecuteCode(object sender, EventArgs e) { }

Nota

Si utiliza un archivo de marcado de flujo de trabajo no compilado y de solo XAML para crear un flujo de trabajo, debe utilizar la extensión de marcado ActivityBind para establecer todas las propiedades de dependencia de controlador de eventos de tipo o no se les llamará durante el tiempo de ejecución. Vea el ejemplo siguiente:

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

Consulte también

Referencia

System.Windows.Markup

Conceptos

Utilización de actividades personalizadas con marcado de flujo de trabajo
Uso de reglas con el marcado de flujo de trabajo
Cómo serializar flujos de trabajo
Información general de serialización

Otros recursos

Markup Samples
Desarrollo de flujos de trabajo

Footer image

Copyright © 2007 Microsoft Corporation. Reservados todos los derechos.