- Microsoft Windows Workflow Foundation 4.0 Cookbook
- Andrew Zhu
- 349字
- 2021-04-13 17:00:34
In this task, we will create a WF program that accepts arguments when initialized in the WF host. In WF4, we can use InArguments
to define the way data flows into an activity.
- Create a workflow project:
Create a new Workflow Console Application under the
Chapter01
solution. Name the projectUseInArgument
. - Author the WF program:
Create a workflow as shown in the following screenshot:
- Write code to host the workflow.
Open the
Program.cs
file and change the host code as follows:using System.Activities; using System.Activities.Statements; namespace UseInArgument { class Program { static void Main(string[] args) { WorkflowInvoker.Invoke(new Workflow1() { FirstName="Andrew", SecondName="Zhu" }); } } }
- Run it:
Set
UseInArgument
as StartUp project. Press Ctrl+F5 to build and run the workflow without debugging. The application should run in a console window and print the following message:
Consider the following statement from the code we saw in the preceding section:
FirstName="Andrew"
FirstName
is an InArgument
type, but how can we assign a string to InArgument
without any explicit cast? This is because InArgument
is declared with an attribute System.ComponentModel.TypeConverterAttribute(System.Activities.XamlIntegration.InArgumentConverter)
. The class inheritance is shown in the following diagram:

It is the InArgumentConverter
that makes assigning a string to an InArgument
possible. If we want to know more about TypeConverter
, we can check MSDN the reference at http://msdn.microsoft.com/en-us/library/system.componentmodel.typeconverter.aspx
In WF3/3.5, we can pass values to Workflow wrapped in a Dictionary<T>
object. This also applies to WF4.
using System.Activities; using System.Activities.Statements; using System.Collections.Generic; namespace UseInArgument { class Program { static void Main(string[] args) { IDictionary<string, object> inputDictionary = new Dictionary<string, object>() { {"FirstName","Andrew"}, {"SecondName","Zhu"} }; WorkflowInvoker.Invoke(new Workflow1(), inputDictionary); } } }
If we are creating workflows using imperative code, we can use InArgument
in the following way:
public class WorkflowInCode:Activity { public InArgument<string> FirstName { get; set; } public InArgument<string> SecondName { get; set; } public WorkflowInCode() { this.Implementation = () => new Sequence() { Activities = { new WriteLine(){ Text=new InArgument<string>( activityContext=>"My name is "+FirstName.Get(activityContext) ) }, new WriteLine(){ Text=new InArgument<string>( ActivityContext=>SecondName.Get(ActivityContext) ) } } }; } }
- AutoCAD 2014 中文版從入門到精通
- AI圖像處理:Photoshop+Firefly后期處理技術基礎與實戰
- Photoshop CC 服裝設計經典實例教程
- Object/Oriented JavaScript
- Unity 2020游戲開發快速上手
- iPad Procreate風格繪畫之美
- PPT設計與制作實戰教程
- Magento: Beginner's Guide
- CorelDRAW X6平面設計與制作案例教程
- Photoshop CC圖像處理案例教程(第2版)
- 24小時玩賺剪映
- Photoshop后期強:多重曝光專業技法寶典
- UG NX 10中文版完全自學手冊
- The 3CX IP PBX Tutorial
- JSF 1.2 Components