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

        {

            get

            {

                return WorkflowEnvironment.WorkflowInstanceId;

            }

        }

 

左は許可、右は不許可

左のコードアクティビティは4倍、右は1倍とする。

 

受け渡しクラスは外に出す。

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

 

受け渡しクラスはGuidの追加と、許可不許可およびそれぞれのFireを追加する。

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

    {

        #region I受け渡しメンバ

 

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

        {

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

            {

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

            }

        }

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

 

        public 受け渡しdelegate 受け渡しデリゲート;

 

 

 

        public event EventHandler<ExternalDataEventArgs> 許可;

        public void Fire許可(Guid guid)

        {

            if (this.許可!= null)

            {

                this.許可(null, new ExternalDataEventArgs(guid));

            }

        }

 

        public event EventHandler<ExternalDataEventArgs> 不許可;

        public void Fire不許可(Guid guid)

        {

            if (this.不許可!= null)

            {

                this.不許可(null, new ExternalDataEventArgs(guid));

            }

        }

 

        #endregion

    }

 

画面を編集する。

4行目を追加して、許可不許可とする。

                   <Grid Grid.Row="3">

                            <Grid.ColumnDefinitions>

                                     <ColumnDefinition Width="0.5*"/>

                                     <ColumnDefinition Width="0.5*"/>

                            </Grid.ColumnDefinitions>

                            <Button Grid.Column="0" Content="許可" Click="許可"/>

                            <Button Grid.Column="1" Content="不許可" Click="不許可"/>

                   </Grid>

 

 

画面のイベントを追加する。

        public void 許可(object sender, RoutedEventArgs args)

        {

                uke.Fire許可(this.guid);

        }

        public void 不許可(object sender, RoutedEventArgs args)

        {

                uke.Fire不許可(this.guid);

        }