使用工作流程標記
Windows Workflow Foundation 提供宣告式的方式給設計工具和開發人員以使用 eXtensible Application Markup Language (XAML) 建立工作流程,進而建立標記原始程式檔。 這些標記檔案可以編譯成為工作流程類型,在執行階段直接載入工作流程執行階段引擎中,或將它們編譯成為附有在 C# 或 Visual Basic 中實作的程式碼後置檔案的工作流程類型。 這表示工作流程標記檔案可不可以編譯視商務原因與是否需要其他實作邏輯而定。 使用有程式碼後置檔案的工作流程標記的方法類似自邏輯檔案中分離簡報檔案。
如需將工作流程標記檔案直接載入工作流程執行階段引擎的範例,請參閱建立工作流程主應用程式主題的<執行工作流程>一節。
除了在工作流程標記中建立工作流程外,您也可以在以 WorkflowPersistenceService 服務保存工作流程時使用工作流程標記,因為在使用 WorkflowMarkupSerializer 序列化程式設計工作流程時,這些工作流程會變成工作流程標記。 如需詳細資訊,請參閱HOW TO:序列化工作流程和 Windows 工作流程持續性服務。
基本結構
工作流程標記的基本結構包含根節點,代表工作流程的類型,後面接著在該工作流程中做為巢狀子項目的子活動。 由於工作流程以 XAML 項目和屬性的子集為基礎,因此工作流程標記檔案的結構看起來和 XAML 檔案的結構類似。 例如,工作流程的每個項目代表複合活動的節點或工作流程本身。 保留節點之間的關係,就像在您透過 C# 或 Visual Basic 等程式設計語言建立工作流程時一樣。
項目和屬性
如之前所述,工作流程標記檔案中的每個項目都對應一個工作流程元件。 這些項目的名稱和您以程式設計方法建立工作流程時使用的活動類型名稱相同。 例如,IfElseActivity 活動是以 <IfElseActivity> 項目表示。 這用於自訂活動時也是 true。
宣告活動成員如下列範例所示:
<SampleActivity Property1="PropValue" Method="CustomMethod" Event="EventHandlerMethod"/>
XAML 也提供使用 x:Code 指令詞項目在工作流程標記檔案內插入程序程式碼的能力。 程式碼必須放置在 CDATA 區段中,如此編譯器才能編譯程式碼,而不是將程式碼視為宣告式 XAML 標記。 下列範例說明如何使用項目配合 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 |
null 值。 |
xmlns:x |
XAML 結構描述的命名空間。 |
xmlns |
工作流程 XAML 結構描述的命名空間。 |
注意
如果您使用未編譯、僅限 XAML 的工作流程標記檔案建立工作流程,則 x:Class 屬性應該不會出現在 XAML 檔案中。 這個屬性只有在編譯工作流程時有效。
注意
如果在建立工作流程標記檔案後變更 VB 應用程式的根命名空間,則也必須更新該工作流程的 x:Class 屬性。
範例
下列是使用工作流程標記檔案,配合包含用於工作流程中的多個事件處理常式的實作邏輯之程式碼後置檔案的範例。
<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>
在這個範例將編譯成功之前,您必須先實作 Condition 和 ExecuteCode 事件處理常式,如下列範例所示:
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) { }
注意
如果您使用未經過編譯、僅限 XAML 的工作流程標記檔案建立工作流程,您必須使用 ActivityBind 標記延伸來設定型別事件處理常式的所有相依性屬性,否則將不會在執行階段呼叫它們。 請參閱下列範例:
<CodeActivity x:Name="codeActivity1" ExecuteCode="{ActivityBind Name=Activity12, Path=codeActivity1_ExecuteCode}" />
請參閱
參考
概念
使用自訂活動配合工作流程標記
使用規則配合工作流程標記
HOW TO:序列化工作流程
序列化概觀
其他資源
Copyright © 2007 by Microsoft Corporation. All rights reserved.