本文翻譯自 Mebyon Kernow 的 "A practical State Machine example",以建築物門禁控制為例,展示 WF4 狀態機核心功能。狀態機套件發布於 Codeplex。
初始狀態:所有門關閉並鎖定 (ClosedLocked)。使用者提供憑證觸發 Unlocked 轉換,驗證通過進入 ClosedUnlocked。其後三種可能:開門、再次鎖定、超時自動鎖定 (5 秒)。
Pick 活動,多個分支並行等待,最先完成者觸發轉換。可設定 Condition 與 Action。
等待外部觸發 (WPF UI 按鈕) 恢復書簽:
public class DoorEvent : NativeActivity
{
protected override bool CanInduceIdle => true;
[RequiredArgument]
public InArgument<string> BookmarkName { get; set; }
protected override void Execute(NativeActivityContext context)
{
context.CreateBookmark(BookmarkName.Get(context), OnBookmarkResumed);
}
private void OnBookmarkResumed(NativeActivityContext context, Bookmark bookmark, object state) { }
}
MainViewModel 管理多個 DoorModel (每道門一個)DoorModel 建立 WorkflowApplication,註冊 IDoor 擴充SetDoorState 更新 ViewModel 狀態_stateMachine.ResumeBookmark("Unlocked", null)_unlockCommand = new DelegateCommand(
unused => _stateMachine.ResumeBookmark("Unlocked", null),
unused => this.DoorState == DoorState.ClosedLocked);
使用自訂 PlaySound 活動於 Transition Action 中播放,區分不同轉換觸發的聲音 (鎖定、解鎖、超時),避免放在 State Entry 無法知曉來源轉換。
執行應用程式可見狀態即時更新、按鈕啟用/停用同步、轉換聲音回饋,完整展示狀態機與 UI 雙向綁定。