DEMO1

まずはやってみよう

 

作成-プロジェクト

C# => Workflow

シーケンシャルと、ステートマシン、それぞれのコンソールアプリ、あとライブラリがある。

 

今回はシーケンシャルのコンソール

 

CodeActivityをぽとぺ

びっくりマークは足りていないあかし

プロパティをみると判別できます。

 

アクティビティをダブルクリック

 

こんなコードを追加

string str = Console.ReadLine();

int コード= int.Parse(str);

this.UserData["Key"] =コード;

this.UserData["偶数フラグ"] = (コード% 2) == 0 ;

 

If-Elseアクティビティをぽとぺ

左から順に評価されていきます。

左のブランチの条件を設定します。

宣言型

ConditionName に適当に設定

Expression 

(bool)this.UserData["偶数フラグ"] == true

という条件をかく

 

これWorkflow1.rulesに記述される。

 

そして左右のブランチにCodeActivityを配置する

private void codeActivity2_ExecuteCode(object sender, EventArgs e)

{

    Console.WriteLine(this.UserData["Key"].ToString() + "だよ〜〜ん");

}

 

private void codeActivity3_ExecuteCode(object sender, EventArgs e)

{

    Console.WriteLine(this.UserData["Key"].ToString() + "ですよ!!");

 

}

一瞬で消えちゃうので、下にCodeActivityで、ReadLineをつける。

実行

 

 

奇数

偶数

試しましょう。

 


 

DEMO2

プロジェクト作成

追加でWFが選べないことを確認

 

いったんスライドに戻る

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

いったん終了

Csprojを開く

 

<ProjectTypeGuids>{14822709-B5A1-4724-98CA-57A101D1B079};

 

    <Reference Include="System.Workflow.Activities" />

    <Reference Include="System.Workflow.ComponentModel" />

    <Reference Include="System.Workflow.Runtime" />

 

  <Import Project="$(MSBuildExtensionsPath)\Microsoft\Windows Workflow Foundation\v3.0\Workflow.Targets" />

 

シーケンシャルワークフローを追加します。

ここでかならず(コード)を選ぶ。XOMLだとまともに動かない。なぜかは今のところわかりません。

ワークフローの追加ができました。

コードアクティビティを追加します。

 

 

ダブルクリック

デバッグ用なので、ブレークポイントを置く

 

こんなXAMLを追加する。

   FontSize="50">

    <Grid>

                   <Grid.RowDefinitions>

                            <RowDefinition Height="*"/>

                            <RowDefinition Height="*"/>

                            <RowDefinition Height="*"/>

                   </Grid.RowDefinitions>

                   <Button Content="ワークフロー開始" Click="開始" Grid.Row="1"/>

    </Grid>

</Window>

 

Csにイベントを追加する。

        public void 開始(object sender, RoutedEventArgs args)

        {

        }

 

Using 5個くらい

using System.Workflow;

using System.Workflow.Activities;

using System.Workflow.ComponentModel;

using System.Workflow.Runtime;

using System.Workflow.Runtime.Hosting;

 

ワークフローランタイムをメンバに追加

        WorkflowRuntime _wr = new WorkflowRuntime();

コンストラクタで、ランタイム開始

            this._wr.StartRuntime();

開始にワークフローを開始するロジックを追加

        public void 開始(object sender, RoutedEventArgs args)

        {

            WorkflowInstance wi = this._wr.CreateWorkflow(typeof(Workflow1));

            wi.Start();

        }

 

テスト

 

ブレークOK

 


 

DEMO3

画面のxamlをテキストボックスと、テキストブロックを追加した形に変更

<TextBox Text="{Binding Path=src}"/>

<Button Content="ワークフロー開始" Click="開始" Grid.Row="1"/>

<TextBlock Text="{Binding Path=dest}" Grid.Row="2"/>

 

やってはいけないけど、データコンテキストに自身を指定

            this.DataContext = this;

 

 

Usingする

using System.ComponentModel;

 

インターフェイス実装する

, InotifyPropertyChanged

 

ファイアを追加する

        public event PropertyChangedEventHandler PropertyChanged;

        private void FirePropertyChanged(string propertyname)

        {

            if (this.PropertyChanged != null) { this.PropertyChanged(this, new PropertyChangedEventArgs(propertyname)); }

        }

 

 

プロパティでsrc, destを追加する

        private int _src;

 

        public int src

        {

            get { return _src; }

            set { _src = value; this.FirePropertyChanged("src"); }

        }

        private int _dest;

 

        public int dest

        {

            get { return _dest; }

            set { _dest = value; this.FirePropertyChanged("dest"); }

        }

 

パラメータ渡しするように変更

       public void 開始(object sender, RoutedEventArgs args)

        {

            Dictionary<string, object> dic = new Dictionary<string, object>();

            dic.Add("src", this.src);

            WorkflowInstance wi = this._wr.CreateWorkflow(typeof(Workflow1), dic);

            wi.Start();

        }

 

Workflow側にもsrcを追加

        private int _src;

 

        public int src

        {

            get { return _src; }

            set { _src = value; }

        }

 

ここまででテスト


 

 

Destプロパティを追加

        private int _dest;

 

        public int dest

        {

            get { return _dest; }

            set { _dest = value; }

        }

 

実装2倍にするだけ

        private void codeActivity1_ExecuteCode(object sender, EventArgs e)

        {

            this.dest = this.src * 2;

        }

 

 

受け渡しインターフェイスを作成

 

    [ExternalDataExchange]

    public interface I受け渡し

    {

        void 受け渡し(int value);

    }

 

CallExternalMethodをぽとぺ

 

さっきのメソッドを指定する

 

受け渡し実装クラスの作成

    public class 受け渡しクラス : I受け渡し

    {

        #region I受け渡しメンバ

 

        public void 受け渡し(int value)

        {

            if (this.受け渡しデリゲート!= null)

            {

                this.受け渡しデリゲート(value);

            }

        }

 

        public Action<int> 受け渡しデリゲート;

 

        #endregion

    }

 

受け渡し実装クラスの登録

コンストラクタに追加

            ExternalDataExchangeService exservice = new ExternalDataExchangeService();

            this._wr.AddService(exservice);

            受け渡しクラス uke = new 受け渡しクラス();

            uke.受け渡しデリゲート= delegate(int value)

            {

                this.dest = value;

            };

            exservice.AddService(uke);


 

DEMO4

 

I受け渡しを以下のように変更する。

    [ExternalDataExchange]

    public interface I受け渡し

    {

        void 受け渡し(Guid guid, int value);

        event EventHandler<ExternalDataEventArgs> 許可;

        event EventHandler<ExternalDataEventArgs> 不許可;

 

    }

 

Guidを持たせるのは、対話するためのインスタンス番号を戻さなくてはいけないため。

 

ワークフロー側にインスタンスGUIDを取得するプロパティを追加する。

        public Guid guid

        {