本節主要介紹如何在WF4.0中使用參數,以及在流程啟動時傳入參數據在流程結束時讀取參數
本文例子下載:
http://files.cnblogs.com/foundation/ArgumentsSample.rar
本文例子說明
數據的傳遞 Arguments 參數
Arguments 參數概述
Arguments是WF的輸出和輸入接口,在同一個流程內,所有Activity共享一組參數.
參數有如下屬性:
Name 參數的名子 Direction 參數的類型添加參數
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();
}
結果