方法: ステート マシン ワークフローを作成する

ワークフローは、ビルトイン アクティビティおよびカスタム アクティビティから構築できます。 このトピックでは、StateMachine アクティビティなどのビルトイン アクティビティ、および前の「方法: アクティビティを作成する」トピックのカスタム アクティビティの両方を使用するワークフローを作成します。 このワークフローは、数値推測ゲームをモデル化しています。

注意

チュートリアル入門の各トピックは、前のトピックに応じて異なります。 このトピックを完了するには、まず「方法: アクティビティを作成する」を完了しておく必要があります。

ワークフローを作成するには

  1. ソリューション エクスプローラーNumberGuessWorkflowActivities を右クリックし、 [追加][新しい項目] の順に選択します。

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

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

  4. ツールボックス[ステート マシン] セクションから StateMachine アクティビティをドラッグし、ワークフロー デザイン サーフェイスの [ここにアクティビティをドロップ] ラベル上にドロップします。

ワークフロー変数および引数を作成するには

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

  2. ワークフロー デザイナーの左下にある [引数] をクリックし、 [引数] ペインを表示します。

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

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

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

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

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

  8. ワークフロー デザイナーの左下にある [変数] をクリックし、 [変数] ペインを表示します。

  9. [変数の作成] をクリックします。

    ヒント

    [変数の作成] ボックスが表示されていない場合は、ワークフロー デザイナー画面の StateMachine アクティビティをクリックして選択します。

  10. [名前] ボックスに「Guess」と入力し、[変数の型] ボックスで [Int32] を選択し、Enter キーを押して変数を保存します。

  11. [変数の作成] をクリックします。

  12. [名前] ボックスに「Target」と入力し、[変数の型] ボックスで [Int32] を選択し、Enter キーを押して変数を保存します。

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

ワークフロー アクティビティを追加するには

  1. [State1] をクリックして選択します。 [プロパティ] ウィンドウで、DisplayNameInitialize Target に変更します。

    ヒント

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

  2. ワークフロー デザイナーで、名前を [Initialize Target] に変更した状態をダブルクリックして展開します。

  3. ツールボックス[プリミティブ] セクションから Assign アクティビティをドラッグし、状態の Entry セクションにドロップします。 [終端側] ボックスに「Target」と入力し、[C# の式を入力してください] ボックスまたは [VB の式を入力してください] ボックスに次の式を入力します。

    New System.Random().Next(1, MaxNumber + 1)  
    
    new System.Random().Next(1, MaxNumber + 1)  
    

    ヒント

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

  4. ワークフロー デザイナーの上部にある階層リンク表示の [StateMachine] をクリックして、ワークフロー デザイナーの全体的なステート マシン ビューに戻ります。

  5. ツールボックス[ステート マシン] セクションから State アクティビティをワークフロー デザイナー上にドラッグし、Initialize Target 状態の上に置きます。 新しい状態が上に置かれると、Initialize Target 状態の周囲に 4 つの三角形が表示されることに注意してください。 Initialize Target 状態のすぐ下にある三角形の上に、新しい状態をドロップします。 これにより、新しい状態がワークフロー上に配置され、Initialize Target 状態から新しい状態への遷移が作成されます。

  6. [State1] をクリックして選択し、DisplayName を「Enter Guess」に変更して、ワークフロー デザイナーでその状態をダブルクリックして展開します。

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

  8. WriteLine[Text] プロパティ ボックスに次の式を入力します。

    "Please enter a number between 1 and " & MaxNumber  
    
    "Please enter a number between 1 and " + MaxNumber  
    
  9. ツールボックス[プリミティブ] セクションから Assign アクティビティをドラッグし、状態の Exit セクションにドロップします。

  10. [終端側] ボックスに「Turns」と入力し、[C# の式を入力してください] ボックスまたは [VB の式を入力してください] ボックスに「Turns + 1」と入力します。

  11. ワークフロー デザイナーの上部にある階層リンク表示の [StateMachine] をクリックして、ワークフロー デザイナーの全体的なステート マシン ビューに戻ります。

  12. ツールボックス[ステート マシン] セクションから FinalState アクティビティをドラッグして Enter Guess 状態の上にマウス ポインターを置き、Enter Guess 状態の右側に表示される三角形の上にドロップすると、Enter GuessFinalState の間に遷移が作成されます。

  13. 遷移の既定名は T2 です。 ワークフロー デザイナーでその遷移をクリックして選択し、その DisplayName に「Guess Correct」を設定します。 その後、FinalState をクリックして選択し、それを右方向へドラッグして、遷移名全体が 2 つの状態のどちらにも重ならずに表示されるようにします。 これにより、チュートリアルの残りの手順をより簡単に実行できます。

  14. ワークフロー デザイナーで、新しい名前に変更された Guess Correct 遷移をダブルクリックして展開します。

  15. ツールボックス[NumberGuessWorkflowActivities] セクションから ReadInt アクティビティをドラッグして遷移の Trigger セクションにドロップします。

  16. ReadInt アクティビティの [プロパティ] ウィンドウで、[BookmarkName] プロパティ値ボックスに「"EnterGuess"」(引用符を含む) と入力し、[Result] プロパティ値ボックスに「Guess」と入力します。

  17. Guess Correct 遷移の [Condition] プロパティ値ボックスに次の式を入力します。

    Guess = Target  
    
    Guess == Target  
    
  18. ワークフロー デザイナーの上部にある階層リンク表示の [StateMachine] をクリックして、ワークフロー デザイナーの全体的なステート マシン ビューに戻ります。

    注意

    トリガー イベントが受け取られ、Condition (存在する場合) が True と評価される場合に遷移が発生します。 この遷移では、ユーザーの Guess がランダムに生成された Target と一致する場合、制御が FinalState に渡され、ワークフローが完了します。

  19. 推定値が正しいかどうかに応じて、ワークフローは FinalState に遷移するか、もう一度実行するために Enter Guess 状態に戻る必要があります。 両方の遷移では、ReadInt アクティビティを介して受け取るユーザーの推定値を待機するのに同じトリガーを共有します。 これは、共有遷移と呼ばれます。 共有遷移を作成するには、Guess Correct 遷移の始点を示す円をクリックし、目的の状態にドラッグします。 この場合、これは自己遷移であるため、Guess Correct 遷移の始点をドラッグし、Enter Guess 状態の下にドロップします。 遷移の作成後、ワークフロー デザイナーでその遷移を選択し、DisplayName プロパティに Guess Incorrect を設定します。

    注意

    共有遷移は、遷移デザイナー内から作成することもできます。これには、遷移デザイナーの下部にある [トリガーを共有する遷移の追加] をクリックし、 [接続の使用可能な状態] ボックスの一覧で、目的となる対象の状態を選択します。

    注意

    遷移の Conditionfalse と評価された場合 (またはトリガーを共有する遷移すべての状態が false と評価された場合)、遷移は行われず、その状態からのすべての遷移のすべてのトリガーが再スケジュールされます。 このチュートリアルでは、条件の構成方法 (推定値が正しいか間違っているかを判断する特定のアクションが用意されています) により、この状況は発生しません。

  20. ワークフロー デザイナーで Guess Incorrect 遷移をダブルクリックして展開します。 Trigger は、Guess Correct 遷移で使用されたのと同じ ReadInt アクティビティに既に設定されていることに注意してください。

  21. [Condition] プロパティ値ボックスに次の式を入力します。

    Guess <> Target  
    
    Guess != Target  
    
  22. ツールボックス[制御フロー] セクションから If アクティビティをドラッグして遷移の Action セクションにドロップします。

  23. If アクティビティの [Condition] プロパティ値ボックスに次の式を入力します。

    Guess < Target
    
  24. ツールボックス[プリミティブ] セクションから 2 つの WriteLine アクティビティをドラッグし、1 つは If アクティビティの Then セクション内に、もう 1 つは Else セクション内に配置されるようにドロップします。

  25. Then セクションの WriteLine アクティビティをクリックして選択し、 [Text] プロパティ値ボックスに次の式を入力します。

    "Your guess is too low."  
    
  26. Else セクションの WriteLine アクティビティをクリックして選択し、 [Text] プロパティ値ボックスに次の式を入力します。

    "Your guess is too high."  
    
  27. ワークフロー デザイナーの上部にある階層リンク表示の [StateMachine] をクリックして、ワークフロー デザイナーの全体的なステート マシン ビューに戻ります。

    次の例は完成したワークフローを示しています。

    Illustration that shows the completed state machine workflow.

ワークフローをビルドするには

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

    ワークフローの実行方法については、次のトピック「方法: ワークフローを実行する」を参照してください。 「方法: ワークフローを実行する」の手順を別のスタイルのワークフローを使用して既に完了している場合に、この手順のステート マシン ワークフローを使用して実行するには、「方法: ワークフローを実行する」の「アプリケーションをビルドして実行するには」に進んでください。

関連項目