ワークフロー マークアップの使用
Windows Workflow Foundation では、XAML (eXtensible Application Markup Language) によるマークアップ ソース ファイルの作成が可能なため、設計者や開発者は、宣言的にワークフローを作成できます。これらのマークアップ ファイルは、1 つのワークフロー型にコンパイルされ、実行時にワークフロー ランタイム エンジンに直接読み込まれます。また、分離コード ファイルで 1 つのワークフロー型にコンパイルし、C# または Visual Basic で実装することもできます。したがって、ビジネス上の理由や、追加的の実装ロジックが必要とされるかどうかに応じて、ワークフロー マークアップ ファイルをコンパイルするかどうかを選択できます。ワークフロー マークアップを分離コード ロジック ファイルで使用するのは、ASP.NET がプレゼンテーション ファイルをロジック ファイルから分離する方法と似ています。
ワークフロー マークアップ ファイルをワークフロー ランタイム エンジンに直接読み込む方法の例については、「ワークフロー ホスト アプリケーションの作成」の「ワークフローの実行」セクションを参照してください。
ワークフロー マークアップでワークフローを作成する以外にも、WorkflowPersistenceService サービスを使用してワークフローを永続化するときにもワークフロー マークアップを使用することができます。これは、プログラム的なワークフローが WorkflowMarkupSerializer でシリアル化される場合、ワークフロー マークアップになるためです。詳細については、「方法 : ワークフローをシリアル化する」および「Windows ワークフロー永続性サービス」を参照してください。
基本構造
ワークフロー マークアップの基本構造には、ワークフローの型を示すルート ノードと、その中にサブ要素として入れ子になった子アクティビティが含まれます。ワークフロー マークアップは、XAML の要素と属性のサブセットに基づいているため、ワークフロー マークアップ ファイルの構造は、XAML ファイルの構造と似ています。たとえば、ワークフロー内の各要素は、複合アクティビティまたはワークフロー自体のノードとして表現されます。ノード間のリレーションシップは、C# や Visual Basic などのプログラム言語でワークフローを作成するときと同様に保持されます。
要素と属性
前述のように、ワークフロー マークアップ ファイル内の各要素は、ワークフロー コンポーネントに対応します。これらの要素の名前は、ワークフローをプログラム言語で作成する場合に使用するアクティビティ型と同じ名前です。たとえば、IfElseActivity アクティビティは、<IfElseActivity> 要素によって表されます。これは、カスタム アクティビティにも該当します。
アクティビティ メンバは、次の例のように宣言されます。
<SampleActivity Property1="PropValue" Method="CustomMethod" Event="EventHandlerMethod"/>
XAML では、ディレクティブ要素 x:Code を使用して、ワークフロー マークアップ ファイル内に手順コードを挿入することができます。コードは、コンパイル時に宣言的 XAML マークアップとして処理されないように、CDATA セクションに配置する必要があります。この要素を 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 のみのワークフロー マークアップ ファイルを使用してワークフローを作成する場合は、XAML ファイル内に x:Class 属性を含めないでください。この属性は、ワークフローのコンパイル時にのみ有効です。 |
![]() |
---|
ワークフロー マークアップ ファイルの作成後に 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}" />
関連項目
参照
概念
ワークフロー マークアップ付きカスタム アクティビティの使用
ワークフロー マークアップでのルールの使用
方法 : ワークフローをシリアル化する
シリアル化の概要
その他の技術情報
Copyright © 2007 by Microsoft Corporation.All rights reserved.