本文转自:http://www.cnblogs.com/foundation/archive/2009/11/25/1610738.html
节主要介绍如何在WF4.0中使用参数,以及在流程启动时传入参数据在流程结束时读取参数
本文例子下载:
https://files.cnblogs.com/foundation/ArgumentsSample.rar
本文例子说明
数据的传递 Arguments 参数
Arguments 参数概述
Arguments是WF的输出和输入接口,在同一个流程内,所有Activity共享一组参数.
参数有如下属性:
Name |
参数的名子 |
Direction |
参数的类型 In Out In/Out Propery |
Argument type |
参数的数据类型 |
Default value |
参数的默认值 In:使用的是表达式 Out,In/Out :无默认值 Propery : 值类型 |
IsRequired |
是否必填 |
添加参数
In参数
System.Activities.InArgument<T>
[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的值
流程 |
|
宿主 |
static void startValueInWorkflow() { System.Collections.Generic.Dictionary<string, object> dic = new System.Collections.Generic.Dictionary<string, object>(); dic.Add("v1",123.456); dic.Add("v2",456.789); WorkflowApplication myInstance = new WorkflowApplication(new StartValueInWorkflow(), dic); myInstance.Run(); } |
结果 |
例: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 { get; set; } 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); } } |
流程 |
|
宿主 |
static void inArgumentWorkflow() { System.Collections.Generic.Dictionary<string, object> dic = new System.Collections.Generic.Dictionary<string, object>(); dic.Add("myValue","wxwinter wxd"); WorkflowApplication myInstance = new WorkflowApplication(new InArgumentWorkflow(), dic); myInstance.Run(); } |
结果 |
Out参数
System.Activities.OutArgument<T>
[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的值
流程 |
|
宿主 |
static void startValueOutWorkflow() { System.Collections.Generic.Dictionary<string, object> dic = new System.Collections.Generic.Dictionary<string, object>(); 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()); } |
|
结果 |
例: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 { set; get; } 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); } } |
流程 |
|
宿主 |
static void outArgumentWorkflow() { WorkflowApplication myInstance = new WorkflowApplication(new OutArgumentWorkflow()); myInstance.Run(); } |
结果 |
In/Out参数
System.Activities.InOutArgument<T>
[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的值
流程 |
|
宿主 |
static void startValueInOutWorkflow() { System.Collections.Generic.Dictionary<string, object> dic = new System.Collections.Generic.Dictionary<string, object>(); 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()); } |
|
结果 |
例: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 { set; get; } 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); } } |
流程 |
|
宿主 |
static void inOutArgumentWorkflow() { WorkflowApplication myInstance = new WorkflowApplication(new InOutArgumentWorkflow()); myInstance.Run(); } |
结果 |