WF4.0 基础篇 (六) 数据的传递 Arguments 参数

节主要介绍如何在WF4.0中使用参数,以及在流程启动时传入参数据在流程结束时读取参数

 

本文例子下载:

http://files.cnblogs.com/foundation/ArgumentsSample.rar

本文例子说明

image.png

image.png

数据的传递 Arguments 参数


Arguments 参数概述

Arguments是WF的输出和输入接口,在同一个流程内,所有Activity共享一组参数.

参数有如下属性:

Name

参数的名子

Direction

参数的类型

In

Out

In/Out

Propery

Argument type

参数的数据类型

Default value

参数的默认值

In:使用的是表达式

Out,In/Out :无默认值

Propery : 值类型

IsRequired

是否必填

 

添加参数

image.png

In参数


System.Activities.InArgument<T>

image.png

[In参数]使用说明

1. 可以用VS设计器在xaml中定义[In参数]

 

2. 在xaml中定义的[In参数],可以在该xaml中被其他Activity用表达式绑定

 

3. 可以用code方式在code Activity中定义[In参数]

 

4. 可以在属性框中, 将code Activity中定义的[In参数]绑定到参数或变量

可以用"表达式"方式赋值

 

5. 运行时,可以用启动参数的方式[In参数]赋值(xaml与code两种方式都可以)

 

6. [In参数]不能在实例的[OnCompleted]事件中用[WorkflowApplicationCompletedEventArgs.Outputs]得到

 

7. 可以使用[Assign] 为 [In参数]赋值

例:XAML方式的[In参数]使用

说明:

1.在xaml格式的workFlow中定义三个[double]型的[In参数]v1,v2,v3

2.启动时为v1,v2赋值

3.在流程内部用[Assign]为v3赋予v1+v2

4.用WriteLine打印v3的值

流程

image.png

宿主

static void startValueInWorkflow()

{

System.Collections.Generic.Dictionary<stringobject> dic = new System.Collections.Generic.Dictionary<stringobject>();

dic.Add("v1",123.456);

dic.Add("v2",456.789);

WorkflowApplication myInstance = new WorkflowApplication(new StartValueInWorkflow(), dic);

myInstance.Run();

}

结果

image.png

 

例:Code方式的[In参数]使用

说明:

1. 定一个Activity名为[InArgumentActivity],其具有一个[string]类型 [In参数]myIn

2. 在xaml格式的workFlow中定义一个[string]型的[In参数]myValue

3. 启动时为myValue赋值

4. 在流程内部添加[InArgumentActivity],将[InArgumentActivity.myIn] 绑定到myValue


 

InArgumentActivity

public sealed class InArgumentActivity : CodeActivity

{

public System.Activities.InArgument<string> myIn { getset; }

 

protected override void Execute(CodeActivityContext context)

{

string s1 = context.GetValue(this.myIn);

string s2 = myIn.Get(context);

 

System.Console.WriteLine(s1);

System.Console.WriteLine(s2);

}

}

流程

image.png

宿主

static void inArgumentWorkflow()

{

System.Collections.Generic.Dictionary<stringobject> dic = new System.Collections.Generic.Dictionary<stringobject>();

dic.Add("myValue","wxwinter wxd");

WorkflowApplication myInstance = new WorkflowApplication(new InArgumentWorkflow(), dic);

myInstance.Run();

}

结果

image.png

 


Out参数


System.Activities.OutArgument<T>

image.png

[Out参数]使用说明

1. 可以用VS设计器在xaml中定义[Out参数]

 

2. 在xaml中定义的[Out参数],可以在该xaml中被其他Activity用表达式绑定

 

3. 可以用code方式在code Activity中定义[Out参数]

 

4. 可以在属性框中, 将code Activity中定义的[Out参数]绑定到参数或变量

不能直接对[Out参数]赋值

 

5. 运行时,不能用启动参数的方式[Out参数]赋值(xaml与code两种方式都不可以)

 

6. [Out参数]可在实例的[OnCompleted]事件中用[WorkflowApplicationCompletedEventArgs.Outputs]得到

 

7. 可以使用[Assign] 为 [Out参数]赋值

 

例:XAML方式的[Out参数]使用

说明:

1.在xaml格式的workFlow中定义二个[double]型的[In参数]v1,v2

定义一个[double]型的[Out 参数]v3

2.启动时为v1,v2赋值

3.在流程内部用[Assign]为v3赋予v1+v2

4.在[completed]中打印v3的值


流程

image.png

宿主

static void startValueOutWorkflow()

{

System.Collections.Generic.Dictionary<stringobject> dic = new System.Collections.Generic.Dictionary<stringobject>();

dic.Add("v1"123.456);

dic.Add("v2"456.789);

WorkflowApplication myInstance = new WorkflowApplication(new StartValueOutWorkflow(), dic);

myInstance.Completed = completed;

myInstance.Run();

}

static void completed(WorkflowApplicationCompletedEventArgs e)

{

System.Console.WriteLine(e.Outputs["v3"].ToString());

}

结果

image.png

 

例:Code方式的[Out参数]使用

说明:

1. 定一个Activity名为[OutArgumentActivity],其具有一个[string]类型 [Out 参数]myOut

2. 在xaml格式的workFlow中定义一个[string]型的变量 myVariable

3. 在流程内部添加[OutArgumentActivity],将[OutArgumentActivity.myOut]绑定到myVariable

4. 添加[WriteLine],打印[myVariable]

OutArgumentActivity

public sealed class OutArgumentActivity : CodeActivity

{

public System.Activities.OutArgument<string> myOut

setget; }

 

protected override void Execute(CodeActivityContext context)

{

//1

string s1 = myOut.Get(context);

myOut.Set(context, "wxd" + s1);

 

//2

string s2 = context.GetValue(myOut);

context.SetValue(myOut, "lzm" + s2);

}

}

流程

image.png

宿主

static void outArgumentWorkflow()

{

WorkflowApplication myInstance = new WorkflowApplication(new OutArgumentWorkflow());

 

myInstance.Run();

}

结果

image.png

 


In/Out参数


System.Activities.InOutArgument<T>

image.png

[In/Out参数]使用说明

1. 可以用VS设计器在xaml中定义[I民/Out参数]

 

2. 在xaml中定义的[In/Out参数],可以在该xaml中被其他Activity用表达式绑定

 

3. 可以用code方式在code Activity中定义[In/Out参数]

 

4. 可以在属性框中, 将code Activity中定义的[In/Out参数]绑定到参数或变量

不能直接对[In/Out参数]赋值

 

5. 运行时, 可以用启动参数的方式[In/Out参数]赋值(xaml与code两种方式都可以)

 

6. [In/Out参数]可在实例的[OnCompleted]事件中用[WorkflowApplicationCompletedEventArgs.Outputs]得到

 

7. 可以使用[Assign] 为 [In/Out参数]赋值

 

例:XAML方式的[In/Out参数]使用

说明:

1.在xaml格式的workFlow中定义三个[string]型的[In/Out参数]v1,v2, v3

2.启动时为v1,v2,v3赋值

3.在流程内部用[Assign]为v3赋予v1 + v2 +v3

4.在[completed]中打印v3的值

流程

image.png

宿主

static void startValueInOutWorkflow()

{

System.Collections.Generic.Dictionary<stringobject> dic = new System.Collections.Generic.Dictionary<stringobject>();

dic.Add("v1""wxd");

dic.Add("v2""lzm");

dic.Add("v3""wxwinter");

WorkflowApplication myInstance = new WorkflowApplication(new StartValueInOutWorkflow(), dic);

myInstance.Completed = completed;

myInstance.Run();

}

static void completed(WorkflowApplicationCompletedEventArgs e)

{

System.Console.WriteLine(e.Outputs["v3"].ToString());

}

结果

image.png

 

例:Code方式的[In/Out参数]使用

说明:

1. 定一个Activity名为[InOutArgumentActivity],其具有一个[string]类型 [In参数]myInOut

2. 在xaml格式的workFlow中定义一个[string]型的变量 myVariable,默认值为"wxwinter"

3. 在流程内部添加[WriteLine],打印myVariable的值

4. 在流程内部添加[InOutArgumentActivity],将[InArgumentActivity. myInOut]绑定到流程的myVariable

5. 在流程内部再添加[WriteLine],打印myVariable的值

InOutArgumentActivity

public sealed class InOutArgumentActivity : CodeActivity

{

public System.Activities.InOutArgument<string> myInOut

setget; }

 

protected override void Execute(CodeActivityContext context)

{

//1

//string s1 = myInOut.Get(context);

//myInOut.Set(context, "wxd:" + s1);

 

//2

string s2 = context.GetValue(myInOut);

context.SetValue(myInOut, "wxd:" + s2);

}

}

流程

image.png

宿主

static void inOutArgumentWorkflow()

{

WorkflowApplication myInstance = new WorkflowApplication(new InOutArgumentWorkflow());

myInstance.Run();

}

结果

image.png


勇哥的学习笔记:

勇哥使用vs2013来实验上面教程的例子。


(1) XAML方式的[In参数]使用


流程创建变量v1,v2,v3,这几个变量会被流程内全部活动所共享。

流程Assign看起来貌似就是个表达式赋值。

image.png

那么v1,v2在什么时候赋值呢?

答案是在宿主程序这边赋值。

如下面代码,使用Dictionary<string, object>字典来赋值,这个其实是WorkflowApplication的某个构造函数里面参数的规定。

其原型如下:

public WorkflowApplication(Activity workflowDefinition, IDictionary<string, object> inputs);


  /// <summary>
        /// //XAML方式的[In参数]使用
        /// </summary>
        static void test1()
        {
            var dic = new Dictionary<string, object>();
            dic.Add("v1", 250.0);
            dic.Add("v2", 350.0);
            var instance = new WorkflowApplication(new Workflow1(), dic);
            instance.Run();
        }


(2)  Code方式的[In参数]使用

先新建一个image.png,代码如下。

它的功能就是获取流程中的参数到当前的代码活动中来。

变量s1,s2演示了两种取得流程参数的写法。

    public sealed class CodeActivity1 : CodeActivity
    {
        // 定义一个字符串类型的活动输入参数
        public InArgument<string> myIn { get; set; }

        // 如果活动返回值,则从 CodeActivity<TResult>
        // 派生并从 Execute 方法返回该值。
        protected override void Execute(CodeActivityContext context)
        {
            // 获取 Text 输入参数的运行时值
            string s1 = context.GetValue(this.myIn);
            string s2 = myIn.Get(context);

            Console.WriteLine(s1);
            Console.WriteLine(s2);
        }
    }

编译这个代码活动。

新建一个活动,在编辑器页面拖入上面的代码活动。

然后创建这个流程的输入变量myValue。

image.png

还没完,一定设置代码活动的属性myIn的值为你刚才创建的流程变量myValue。

image.png

接下来的事交给宿主程序了,主要就是启动流程前给myValue赋值。

代码如下:

   /// <summary>
        /// Code方式的[In参数]使用
        /// </summary>
        static void test2()
        {
           var dic = new Dictionary<string, object>();
           dic.Add("myValue", "www.skcircle.com");
           var instance = new WorkflowApplication(new test2(), dic);
           instance.Run();
        }

(3)XAML方式的[Out参数]使用

这种方式跟例子(1)的演示代码差别不大。


image.png

宿主程序如下:

/// <summary>
        /// XAML方式的[Out参数]使用
        /// </summary>
        static void test3()
        {
            var dic = new Dictionary<string, object>();
            dic.Add("v1", 250.1);
            dic.Add("v2", 350.2);
            var instance = new WorkflowApplication(new test3(), dic);
            instance.Completed = completed;
            instance.Run();
        }

        static void completed(WorkflowApplicationCompletedEventArgs e)
        {
            Console.WriteLine(e.Outputs["v3"].ToString());
        }

image.png

(4) Code方式的[Out参数]使用


新建一个代码活动,代码如下:

注意代码中红色这个对象,它表示活动输出参数,InArgument则表示输入参数。勇哥这个地方搞错了,一个多小时都不知道为什么运行不出结果!!

        public System.Activities.OutArgument<string> myOut{ set; get; }

方法Execute中演示给这个输出参数赋值的方法。


    public sealed class CodeActivity2 : CodeActivity
    {
        // 定义一个字符串类型的活动输出参数
        public System.Activities.OutArgument<string> myOut{ set; get; }

        // 如果活动返回值,则从 CodeActivity<TResult>
        // 派生并从 Execute 方法返回该值。
        protected override void Execute(CodeActivityContext context)
        {
            //// 获取 Text 输入参数的运行时值
            //1
            string s1 = myOut.Get(context);
            myOut.Set(context, "wxd" + s1);

            //2
            string s2 = context.GetValue(myOut);
            context.SetValue(myOut, "lzm" + s2);
            
        }


    }

然后编译这个代码活动。

新建一个新的活动,工作流如下:

同时创建一个变量myVariable。

CodeActivity2的myOut设置为myVariable。

image.png

最后在宿主程序里面运行流程。

        /// <summary>
        /// Code方式的[Out参数]使用
        /// </summary>
        static void test4()
        {
            var instance = new WorkflowApplication(new test4());
            instance.Run();
        }

总结:

这个例子讲的out参数指的是在代码活动中通过OutArgument 输出对象绑定到流程中的变量上去的方法。


(5)(6)in/out参数的例子勇哥就不重复了,跟(3)(4)差不多。


了解本节的内容,居然花了一上午的时间,这个算是比较重要的内容。

本节内容总结为一句话: 新建的活动可以设置in、out、in/out参数,新建的代码活动也可以设置in、out、in/out参数两者区别比较大。




本文出自勇哥的网站《少有人走的路》wwww.skcircle.com,转载请注明出处!讨论可扫码加群:

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

会员中心
搜索
«    2024年4月    »
1234567
891011121314
15161718192021
22232425262728
2930
网站分类
标签列表
最新留言
    热门文章 | 热评文章 | 随机文章
文章归档
友情链接
  • 订阅本站的 RSS 2.0 新闻聚合
  • 扫描加本站机器视觉QQ群,验证答案为:halcon勇哥的机器视觉
  • 点击查阅微信群二维码
  • 扫描加勇哥的非标自动化群,验证答案:C#/C++/VB勇哥的非标自动化群
  • 扫描加站长微信:站长微信:abc496103864
  • 扫描加站长QQ:
  • 扫描赞赏本站:
  • 留言板:

Powered By Z-BlogPHP 1.7.2

Copyright Your skcircle.com Rights Reserved.

鄂ICP备18008319号


站长QQ:496103864 微信:abc496103864