方法: アクティビティを作成する

アクティビティは WF の動作の中心的な単位です。 アクティビティの実行ロジックはマネージド コードで実装できます。または他のアクティビティを使用して実装できます。 このトピックでは、2 つのアクティビティを作成する方法について説明します。 最初のアクティビティは、コードを使用してその実行ロジックを実装する単純なアクティビティです。 2 番目のアクティビティの実装は他のアクティビティを使用して定義されています。 これらのアクティビティは、チュートリアルの次の手順で使用します。

アクティビティ ライブラリ プロジェクトを作成する

  1. Visual Studio を開き、[ファイル] メニューから [新規]>[プロジェクト] を選択します。

  2. [新しいプロジェクト] ダイアログの [インストール済み] カテゴリで、[Visual C#]>[ワークフロー] (または[Visual Basic]>[ワークフロー]) を選択します。

    注意

    [ワークフロー] テンプレート カテゴリが表示されない場合は、必要に応じて Visual Studio の Windows Workflow Foundation コンポーネントをインストールします。 [新しいプロジェクト] ダイアログの左側にある [Visual Studio インストーラーを開く] リンクを選択します。 Visual Studio インストーラーで [個別のコンポーネント] タブを選択します。次に、 [開発作業] カテゴリで、Windows Workflow Foundation コンポーネントを選択します。 [変更] を選択してコンポーネントをインストールします。

  3. [アクティビティ ライブラリ] プロジェクト テンプレートを選択します。 [名前] ボックスに「NumberGuessWorkflowActivities」と入力して、[OK] をクリックします。

  4. ソリューション エクスプローラーで、[Activity1.xaml] を右クリックし、[削除] を選択します。 [OK] をクリックして確定します。

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 ArgumentException("BookmarkName cannot be an Empty string.",
                    "BookmarkName")
            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 引数を介して公開される 1 つの結果がアクティビティによって提供される場合に使用できますが、CodeActivity<TResult> ではブックマークの使用がサポートされていないため、NativeActivity<TResult> が使用されます。

Prompt アクティビティを作成する

  1. Ctrl+Shift+B キーを押して、プロジェクトをビルドします。 プロジェクトをビルドすると、このプロジェクトの ReadInt アクティビティを使用して、この手順からカスタム アクティビティをビルドできます。

  2. [プロジェクト] メニューの [新しい項目の追加] をクリックします。

  3. [インストール済み]>[共通項目] ノードで、[ワークフロー] を選択します。 [ワークフロー] 一覧から [アクティビティ] を選択します。

  4. [名前] ボックスに「Prompt」と入力して、[追加] をクリックします。

  5. ソリューション エクスプローラーPrompt.xaml をダブルクリックし、デザイナーにワークフローを表示します (まだ表示されていない場合)。

  6. アクティビティ デザイナーの左下にある [引数] をクリックして、[引数] ウィンドウを表示します。

  7. [Create Argument] (引数の作成) をクリックします。

  8. [名前] ボックスに「BookmarkName」と入力し、[方向] ドロップダウン リストから [入力] を選択し、[引数の型] ドロップダウン リストから [文字列] を選択して、Enter キーを押して引数を保存します。

  9. [Create Argument] (引数の作成) をクリックします。

  10. 新しく追加した BookmarkName 引数の下にある [名前] ボックスに「Result」と入力し、[方向] ボックスで [出力] を選択して、[引数の型] ドロップダウン リストで [Int32] を選択し、Enter キーを押します。

  11. [Create Argument] (引数の作成) をクリックします。

  12. [名前] ボックスに「Text」と入力し、[方向] ドロップダウン リストから [入力] を選択し、[引数の型] ドロップダウン リストから [文字列] を選択して、Enter キーを押して引数を保存します。

    これら 3 つの引数は、次の手順で、WriteLine アクティビティに追加される ReadInt アクティビティと Prompt アクティビティの対応する引数にバインドされます。

  13. アクティビティ デザイナーの左下にある [引数] をクリックして、[引数] ウィンドウを閉じます。

  14. ツールボックス[制御フロー] セクションから Sequence アクティビティをドラッグし、Prompt アクティビティ デザイナーの [ここにアクティビティをドロップ] ラベルの上にドロップします。

    ヒント

    [ツールパレット] ウィンドウが表示されていない場合は、[表示] メニューから [ツールパレット] を選択します。

  15. ツールボックス[プリミティブ] セクションから WriteLine アクティビティをドラッグし、Sequence アクティビティの [ここにアクティビティをドロップ] ラベルの上にドロップします。

  16. [プロパティ] ウィンドウの [C# の式を入力してください] ボックスまたは [VB の式を入力してください] ボックスに「Text」と入力して、WriteLine アクティビティの Text 引数を Prompt アクティビティの Text 引数にバインドします。次に Tab キーを 2 回押します。 これで、IntelliSense リスト メンバー ウィンドウを閉じ、プロパティから選択を外してプロパティ値を保存します。 このプロパティは、アクティビティ自体の [C# の式を入力してください] ボックスまたは [VB の式を入力してください] ボックスに「Text」と入力して設定することもできます。

    ヒント

    [プロパティ] ウィンドウが表示されていない場合は、 [表示] メニューから [プロパティ ウィンドウ] を選択します。

  17. ツールボックス[NumberGuessWorkflowActivities] セクションから ReadInt アクティビティをドラッグし、WriteLine アクティビティの後になるように Sequence アクティビティ内にドロップします。

  18. [プロパティ] ウィンドウBookmarkName 引数の右にある [VB の式を入力してください] ボックスに「BookmarkName」と入力して、ReadInt アクティビティの BookmarkName 引数を Prompt アクティビティの BookmarkName 引数にバインドします。次に Tab キーを 2 回押して IntelliSense リスト メンバー ウィンドウを閉じ、プロパティを保存します。

  19. [プロパティ] ウィンドウResult 引数の右にある [VB の式を入力してください] ボックスに「Result」と入力して、ReadInt アクティビティの Result 引数を Prompt アクティビティの Result 引数にバインドします。次に Tab キーを 2 回押します。

  20. Ctrl+Shift+B キーを押して、ソリューションをビルドします。

次のステップ

これらのアクティビティを使用してワークフローを作成する手順については、チュートリアルの次の手順「方法: ワークフローを作成する」を参照してください。

関連項目