Windows Workflow Foundation (WF) 的強大之處在於能將複雜的業務邏輯視覺化、模組化。在前幾章中,我們已學會如何執行代碼、處理異常、暫停與終止工作流。然而,任何完整的電腦系統都必須具備「根據運行時條件做出判斷、執行不同任務」的能力。本章將深入探討三大核心邏輯流活動:IfElse(條件分支)、While(迴圈判斷)與 Replicator(模擬 for 迴圈),並透過一個「問卷調查」實戰範例,示範如何靈活運用它們來簡化工作流設計。
WF 提供了基於運行時條件進行邏輯控制流的活動。本章採用 CodeCondition 方式——在 C# 代碼中撰寫條件邏輯(第 12 章將介紹基於規則的 RuleCondition)。兩種方式各有優勢,開發者可根據專案需求選擇。
本章範例為一個 Windows Forms 應用程式,包含三個可自訂的「是/否」問題,支援兩種模式:
工作流將回答收集為 Boolean[] 陣列回傳宿主,UI 以藍/綠/紅圓球即時顯示進度與結果(全對顯示綠球,否則顯示「8」字球)。


IfElse 是最直觀的條件分支活動。它包含左右兩個分支,左邊對應 true,右邊對應 false。每個分支都是容器,可放入任意活動。使用步驟如下:
Condition 屬性為「代碼條件」,輸入事件處理器名稱(如 AskQuestion1)。MessageBox 詢問問題,將結果寫入 e.Result。Code 活動(AffirmQ1),右分支放入 Code 活動(NegateQ1),分別處理肯定/否定邏輯。Dependent 屬性決定是否跳過後續提問。SendResponseDataToHost 將結果回傳宿主。

觀察:使用 IfElse 處理重複性提問需 31 步驟,工作流圖顯得冗長。這提示我們:對於「重複執行相似邏輯」的場景,迴圈結構更合適。
While 活動在條件為 true 時持續迴圈,條件為 false 時結束。它極大地簡化了問卷流程:
Condition 為 TestComplete。Code 活動 AskQuestion,透過索引 _qNum 依序提問。TestComplete 中判斷是否遍歷完所有問題,決定 e.Result。AskQuestion 中處理相依邏輯:若回答為否且為相依模式,直接將剩餘題目標記為否並遞增索引至結束。

對比:While 版本工作流圖極度精簡,直觀展示「迴圈詢問、條件結束」的核心邏輯,維護性大幅提升。
Replicator 並非單純對應 C# for 迴圈,更像 ASP.NET Repeater 控制項:它根據 IList 資料源的項目數量,動態複製唯一的子活動(容器),支援循序或平行執行。核心屬性與事件如下:
| 屬性 | 功能 |
|---|---|
| ExecutionType | Sequence(循序)或 Parallel(平行) |
| InitialChildData | 綁定 IList 集合,每個元素對應一個子活動實例 |
| 事件 | 觸發時機 |
|---|---|
| InitializedEvent | Replicator 啟動時,僅一次 |
| ChildInitializedEvent | 每個子活動初始化後 |
| UntilCondition | 每個子活動執行前,Result=false 繼續,true 終止 |
| ChildCompleteEvent | 每個子活動完成後 |
| CompleteEvent | 所有子活動完成後 |

Initialized=InitializeLoop、Completed=LoopCompleted、ChildInitialized=PrepareQuestion、ChildCompleted=QuestionAsked、UntilCondition=TestContinue(代碼條件)。Code 活動 AskQuestion。_qNums 對應題目索引,在 InitializeLoop 中綁定至 InitialChildData。PrepareQuestion 從 e.InstanceData 取得當前題號;AskQuestion 彈出提問並記錄回答;QuestionAsked 將結果寫入 _response。TestContinue 判斷:若相依模式且當前答否,標記剩餘為否並終止;若已處理最後一題則終止;否則繼續。LoopCompleted 將結果指派給回傳活動。

結論:三種活動各有適用場景——IfElse適合靜態分支,While適合動態條件迴圈,Replicator適合基於集合的批次處理,且支援平行化。實務上應根據業務複雜度選擇最簡潔的方案。