共用方式為


作法:建立活動

活動是 WF 中的行為核心單位。 活動的執行邏輯可以實作在 Managed 程式碼中,或是使用其他活動來實作。 本主題示範如何建立兩個活動。 第一個活動是簡單的活動,使用程式碼來實作其執行邏輯。 第二個活動的實作則是使用其他活動來定義。 教學課程中的下列步驟將會使用這些活動。

建立活動程式庫專案

  1. 開啟 Visual Studio,然後從 [檔案] 功能表選擇[新增]>[專案]

  2. 在 [新增專案] 對話方塊的 [已安裝] 類別下,選取 [Visual C#]>[工作流程] (或是 [Visual Basic]>[工作流程])。

    注意

    如果您看不到工作流程範本類別,則可能需要安裝 Visual Studio 的 Windows Workflow Foundation 元件。 選擇 [新增專案] 對話方塊左側的 [開啟 Visual Studio 安裝程式] 連結。 在 Visual Studio 安裝程式中選取 [個別元件] 索引標籤。然後,在 [開發活動] 類別之下,選取 [Windows Workflow Foundation] 元件。 選擇 [修改] 以安裝元件。

  3. 選取 [活動程式庫] 專案範本。 在 [名稱] 方塊中輸入 NumberGuessWorkflowActivities,然後按一下 [確定]

  4. 在 [方案總管] 中的 [Activity1.xaml] 上按一下滑鼠右鍵,並選擇 [刪除]。 按一下 [ 確定 ] 以確認。

建立 ReadInt 活動

  1. 選擇 [專案] 功能表中的 [加入新項目]

  2. 在 [已安裝]>[一般項目] 節點中,選取 [工作流程]。 選取 [工作流程] 清單中的 [程式碼活動]

  3. 在 [名稱] 方塊中輸入 ReadInt,然後按一下 [加入]

  4. 以下列定義取代現有的 ReadInt 定義。

    public sealed class ReadInt : NativeActivity<int>
    {
        [RequiredArgument]
        public InArgument<string> BookmarkName { get; set; }
    
        protected override void Execute(NativeActivityContext context)
        {
            string name = BookmarkName.Get(context);
    
            if (string.IsNullOrEmpty(name))
            {
                throw new ArgumentException("BookmarkName cannot be an Empty string.",
                    "context");
            }
    
            context.CreateBookmark(name, new BookmarkCallback(OnReadComplete));
        }
    
        // NativeActivity derived activities that do asynchronous operations by calling
        // one of the CreateBookmark overloads defined on System.Activities.NativeActivityContext
        // must override the CanInduceIdle property and return true.
        protected override bool CanInduceIdle
        {
            get { return true; }
        }
    
        void OnReadComplete(NativeActivityContext context, Bookmark bookmark, object state)
        {
            this.Result.Set(context, Convert.ToInt32(state));
        }
    }
    
    Public NotInheritable Class ReadInt
        Inherits NativeActivity(Of Integer)
    
        <RequiredArgument()>
        Property BookmarkName() As InArgument(Of String)
    
        Protected Overrides Sub Execute(ByVal context As NativeActivityContext)
            Dim name As String
            name = BookmarkName.Get(context)
    
            If name = String.Empty Then
                Throw New Exception("BookmarkName cannot be an Empty string.")
            End If
    
            context.CreateBookmark(name, New BookmarkCallback(AddressOf OnReadComplete))
        End Sub
    
        ' NativeActivity derived activities that do asynchronous operations by calling 
        ' one of the CreateBookmark overloads defined on System.Activities.NativeActivityContext 
        ' must override the CanInduceIdle property and return True.
        Protected Overrides ReadOnly Property CanInduceIdle As Boolean
            Get
                Return True
            End Get
        End Property
    
        Sub OnReadComplete(ByVal context As NativeActivityContext, ByVal bookmark As Bookmark, ByVal state As Object)
            Result.Set(context, Convert.ToInt32(state))
        End Sub
    
    End Class
    

    注意

    ReadInt 活動衍生自 NativeActivity<TResult>,而不是程式碼活動範本預設的 CodeActivity。 如果活動提供單一結果 (透過 CodeActivity<TResult> 引數公開),則可使用 Result,但 CodeActivity<TResult> 不支援使用書籤,因而會使用 NativeActivity<TResult>

建立提示活動

  1. Ctrl+Shift+B 建置專案。 建置專案可將此專案中的 ReadInt 活動用來建置此步驟中的自訂活動。

  2. 選擇 [專案] 功能表中的 [加入新項目]

  3. 在 [已安裝]>[一般項目] 節點中,選取 [工作流程]。 從 [工作流程] 清單中選取 [活動]

  4. 在 [名稱] 方塊中輸入 Prompt,然後按一下 [加入]

  5. 如果未顯示的話,請按兩下 [方案總管] 中的 [Prompt.xaml],在設計工具中顯示它。

  6. 在活動設計工具的左下方按一下 [引數],以顯示 [引數] 窗格。

  7. 按一下 [建立引數]

  8. 在 [名稱] 方塊中輸入 BookmarkName,並在 [方向] 下拉清單中選取 [內],接著在 [引數型別] 下拉式清單中選取 [字串],再按 Enter 以儲存引數。

  9. 按一下 [建立引數]

  10. 在新加入之 BookmarkName 引數下方的 [名稱] 方塊中輸入 Result,並選取 [方向] 下拉式清單中的 [外],再選取 [引數型別] 下拉式清單中的 [Int32],然後按 Enter

  11. 按一下 [建立引數]

  12. 在 [名稱] 方塊中輸入 Text,並在 [方向] 下拉清單中選取 [內],接著在 [引數型別] 下拉式清單中選取 [字串],再按 Enter 以儲存引數。

    這三個引數會繫結至下列步驟中加入至 WriteLine 活動之 ReadIntPrompt 活動的對應引數。

  13. 在活動設計工具的左下方按一下 [引數],以關閉 [引數] 窗格。

  14. 從 [工具箱] 的 [控制流程] 區段,將 [序列] 活動拖放到 [提示] 活動設計工具的 [在此放置活動] 標籤上。

    提示

    若 [工具箱] 視窗並未顯示,請從 [檢視] 功能表中選取 [工具箱]

  15. 從 [工具箱] 的 [基本] 區段,將 [WriteLine] 活動拖放到 [序列] 活動的 [在此放置活動] 標籤上。

  16. 在 [屬性] 視窗中的 [輸入 C# 運算式] 或 [輸入 VB 運算式] 方塊中輸入 Text,以將 [WriteLine] 活動的 Text 引數繫結到 [提示] 活動的 Text 引數,然後按兩次 Tab 鍵。 這樣會將選項移出屬性外,以關閉 IntelliSense 清單成員視窗並儲存屬性值。 您也可以在活動本身的 [輸入 C# 運算式] 或 [輸入 VB 運算式] 方塊中輸入 Text,以設定這個屬性。

    提示

    若 [屬性] 視窗並未顯示,請從 [檢視] 功能表中選取 [屬性視窗]

  17. 從 [工具箱] 的 [NumberGuessWorkflowActivities] 區段,將 [ReadInt] 活動拖放到 [Sequence] 活動內,使其追蹤 [WriteLine] 活動。

  18. 在 [屬性視窗]BookmarkName 引數右側的 [輸入 VB 運算式] 方塊中輸入 BookmarkName,將 [ReadInt] 活動的 BookmarkName 引數繫結至 [Prompt] 活動的 BookmarkName 引數,然後按兩次 Tab 鍵關閉 IntelliSense 清單成員視窗,並儲存屬性。

  19. 在 [屬性視窗]Result 引數右側的 [輸入 VB 運算式] 方塊中輸入 Result,將 [ReadInt] 活動的 Result 引數繫結至 [提示] 活動的 Result 引數,然後按兩次 Tab 鍵。

  20. 若要建置解決方案,請按 Ctrl+Shift+B

下一步

如需如何使用這些活動來建立工作流程的詳細資訊,請參閱以下教學課程中的下一步:如何:建立工作流程

另請參閱