Utilizzo dei markup del flusso di lavoro
Windows Workflow Foundation offre a progettisti e sviluppatori una modalità dichiarativa per creare flussi di lavoro utilizzando eXtensible Application Markup Language (XAML) per creare file di markup di origine. Questi file di tag possono essere compilati in un tipo del flusso di lavoro, caricati direttamente in fase di esecuzione nel motore di runtime del flusso di lavoro o possono essere compilati in un tipo del flusso di lavoro con file di codice sottostanti implementati in C# o Visual Basic. Ciò significa che i file di tag del flusso di lavoro possono essere compilati o meno, a seconda di ragioni aziendali e se è richiesta la logica di implementazione aggiuntiva o meno. L'utilizzo di tag del flusso di lavoro con file logici di codice sottostante è simile al modo in cui ASP.NET separa i file di presentazione dai file logici.
Per un esempio di come caricare direttamente un file di tag del flusso di lavoro nel motore di runtime del flusso di lavoro, vedere la sezione Esecuzione dei flussi di lavoro nell'argomento Creazione di un'applicazione host del flusso di lavoro.
Oltre a creare un flusso di lavoro come markup del flusso di lavoro, è anche possibile utilizzare tag del flusso di lavoro quando si salva in modo permanente un flusso di lavoro con un servizio WorkflowPersistenceService perché quando flussi di lavoro a livello di codice vengono serializzati con WorkflowMarkupSerializer, divengono tag del flusso di lavoro. Per ulteriori informazioni, vedere Procedura: serializzare i flussi di lavoro e Servizi di persistenza del flusso di lavoro di Windows.
Struttura di base
La struttura di base dei tag del flusso di lavoro contiene il nodo radice, che indica il tipo di flusso di lavoro, seguito dalle attività figlio del flusso di lavoro come sottoelementi nidificati. Poiché i tag del flusso di lavoro sono basati su un sottoinsieme di elementi XAML e attributi, la struttura dei file di tag del flusso di lavoro risulta simile a quella di un file XAML. Ad esempio, ogni elemento del flusso di lavoro è rappresentato come nodi di attività composte o come un flusso di lavoro, a sua volta. La relazione tra nodi viene mantenuta uguale a come era al momento della creazione dei flussi di lavoro tramite un linguaggio di programmazione, ad esempio C# o Visual Basic.
Elementi e attributi
Come affermato in precedenza, ogni elemento di un file di tag del flusso di lavoro corrisponde a un componente del flusso di lavoro. I nomi di quegli elementi sono gli stessi nomi dei tipi di attività utilizzati quando si creano flussi di lavoro a livello di codice. Ad esempio, l'attività IfElseActivity è rappresentata dall'elemento <IfElseActivity>. Ciò vale anche per le attività personalizzate.
I membri delle attività vengono dichiarati come mostra l'esempio seguente:
<SampleActivity Property1="PropValue" Method="CustomMethod" Event="EventHandlerMethod"/>
XAML offre anche la possibilità di inserire codice procedurale all'interno di un file di tag del flusso di lavoro utilizzando l'elemento direttivo x:Code. Il codice deve essere posizionato in una sezione CDATA così che il compilatore possa compilare il codice anziché trattarlo come tag XAML dichiarative. L'esempio seguente mostra come viene utilizzato l'elemento con una sezione CDATA.
<CodeActivity x:Name="codeActivity1" ExecuteCode="methodName1">
<x:Code><![CDATA[
void methodName1(object sender, EventArgs e)
{
}
]]></x:Code>
</CodeActivity>
Nota
L'elemento direttivo x:Code può essere utilizzato solo in file di tag del flusso di lavoro compilati.
Nella tabella riportata di seguito vengono descritti gli attributi più comuni dei tag del flusso di lavoro.
Attributo | Descrizione |
---|---|
x:Array |
Matrice di tipi. |
x:Class |
Nome della classe del flusso di lavoro, incluso lo spazio dei nomi. La classe con questo nome viene creata quando viene compilato il flusso di lavoro. |
x:Name |
Nome dell’attività. Corrisponde alla proprietà Activity.Name. |
x:Type |
Riferimento al tipo. |
x:Null |
Valore null. |
xmlns:x |
Spazio dei nomi dello schema XAML. |
xmlns |
Spazio dei nomi dello schema XAML del flusso di lavoro. |
Nota
Se si utilizza un un file di tag del flusso di lavoro non-compilato, solo XAML, per creare un flusso di lavoro, l'attributo x:Class non deve essere presente nel file XAML. Questo attributo è valido soltanto quando viene compilato il flusso di lavoro.
Nota
Se lo spazio dei nomi radice di un'applicazione VB viene modificato dopo che un file di tag del flusso di lavoro è stato creato, anche l'attributo x:Class del flusso di lavoro deve essere aggiornato.
Esempio
Il seguente è un esempio di un file di tag del flusso di lavoro utilizzato con un file di codice sottostante che contiene l'implementazione della logica per i vari gestori di eventi del flusso di lavoro.
<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>
È necessario implementare i gestori di eventi Condition e ExecuteCode prima che questo esempio possa essere compilato correttamente, come nell'esempio seguente:
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
Se si utilizza un un file di tag del flusso di lavoro non-compilato, solo XAML, per creare un flusso di lavoro, è necessario utilizzare l'estensione di markup ActivityBind per impostare tutte le proprietà della dipendenza del gestore di eventi tipo o essi non saranno chiamati durante la fase di esecuzione. Vedere l'esempio che segue:
<CodeActivity x:Name="codeActivity1" ExecuteCode="{ActivityBind Name=Activity12, Path=codeActivity1_ExecuteCode}" />
Vedere anche
Riferimenti
Concetti
Utilizzo di attività personalizzate con markup del flusso di lavoro
Utilizzo di regole con tag del flusso di lavoro
Procedura: serializzare i flussi di lavoro
Panoramica sulla serializzazione
Altre risorse
Markup Samples
Sviluppo dei flussi di lavoro
Copyright © 2007 Microsoft Corporation. Tutti i diritti riservati.