WWF包含了一组丰富的通用用户活动,这些能满足绝大多数的场景的需求。但有时,我们还是会碰到需要一些更加自定义的活动的场景。WWF SDK拥有一些可扩展的特性,能使你轻松的创建自定义的活动,并把他们应用到你的解决方案中。在这一节中,我们会编写一个自定义活动,用来根据传入工作流的参数,从网页中下载文本。


创建一个网页解析自定义活动


这个自定义活动会根据传入活动的网页属性集,从网页中下载文本。页面一旦下载完毕,活动就会发出一个网页下载完毕的事件,并把网页数据值发回工作流。


创建WebTearActivity类


WebTear类继承自System.Workflow.ComponentModel.Activity类。当你定义了一个自定义活动时,把ToolboxItemAttributes属性应用到类上,并指明为ActivityboxItem类型。以下的代码就是一个最小的自定义活动。

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_数据using System;

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_microsoft_02using System.ComponentModel;

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_数据_03using System.Workflow.ComponentModel;

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_microsoft_04using System.Workflow.ComponentModel.Design;

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_.net_05using System.Workflow.ComponentModel.Compiler;

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_microsoft_06

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_数据_07namespace Microsoft.Samples.Workflow.Quickstarts.CustomActivity

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_microsoft_08Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_.net_09 {

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_.net_10 [ToolboxItemAttribute(typeof(ActivityToolboxItem))]

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_自定义_11 public class WebTear : System.Workflow.ComponentModel.Activity

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_sed_12Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_.net_13  {

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_.net_14 }

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_sed_15}



定义活动属性


自定义活动属性的定义和WinForm控件属性的定义类似。当你定义一个自定义活动的属性时,使用DependencyProperty来存储属性的属性。这能让各种不同类型的属性都能一致地有效地工作。在实际定义属性时,你可能还会用到DependencyProperty类中的方法,所以,不要把这个字段定义成private。

活动中的一个属性可以应用许多不同的特性。这些特性通常都是用来支持WWF设计器的工作的。我们的这个属性应用了一下的特性:

1. CategoryAttribute:在设计器的属性窗口中,这个属性位于那个分类下。

2. DescriptionAttribute:设计器属性窗口中显示的属性描述。

3. BrowsableAttribute:这是一个布尔值,指示了是否在属性窗口中显示这个属性。

4. ValidationVisibilityAttribute:指定了如何验证属性的值。验证选项包括:可选Optional、必需Required、隐藏Hidden。

5. DesignerSerializationVisibilityAttribute:指定了是否和如何序列化这个属性。选项包括:可见Visible、隐藏Hidden、内容Content。

以下的代码示例了如何定义WebPage属性。

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_microsoft_16public static DependencyProperty WebPageProperty =

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_自定义_17 DependencyProperty.Register("WebPage", typeof(System.String), typeof (Microsoft.Samples.Workflow.Quickstarts.CustomActivity.WebTear ) );

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_自定义_18

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_microsoft_19[DesignerSerializationVisibilityAttribute(DesignerSerializationVisibility.Visible)]

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_.net_20[ValidationVisibilityAttribute(ValidationVisibility.Optional)]

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_自定义_21[BrowsableAttribute(true)]

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_sed_22[DescriptionAttribute("Web page to download")]

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_数据_23[CategoryAttribute("WebTear Property")]

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_.net_24public string WebPage

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_.net_25Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_数据_26 {

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_自定义_27 get

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_自定义_28Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_.net_29  {

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_自定义_30 return ((string)(base.GetValue(Microsoft.Samples.Workflow.Quickstarts.CustomActivity.WebTear.WebPageProperty)));

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_.net_31 }

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_.net_32 set

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_microsoft_33Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_自定义_34  {

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_自定义_35 base.SetValue(Microsoft.Samples.Workflow.Quickstarts.CustomActivity.WebTear.WebPageProperty, value);

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_microsoft_36 }

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_数据_37}



重载Execute方法


当你创建了一个自定义活动,运行时,工作流引擎会调用活动的Execute方法来执行活动实际的操作。这个方法是在基类中定义的,但你可以重载这个方法,以适应你的活动的功能。

WebTear活动会在Execute方法中下载请求的网页,并在下载完成后引发一个事件,将页面数据发回工作流。我们需要定义一个PageFinishedEventArgs类用于事件参数,这个类中有一个Data字段用来存放网页数据。这些数据会在之后被工作流中的事件处理函数访问到。一旦数据下载完毕,Execute方法返回一个Status.Closed枚举值,来通知工作流引擎活动已经完成执行了。

一下的代码演示了如何定义PageFinishedEventArgs类

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_数据_38public class PageFinishedEventArgs

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_sed_39Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_.net_40 {

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_sed_41 private string data;

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_.net_42

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_.net_43 public PageFinishedEventArgs( string data )

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_microsoft_44Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_microsoft_45  {

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_microsoft_46 this.data = data;

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_数据_47 }

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_自定义_48

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_sed_49 public string Data

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_.net_50 Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_.net_51  {

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_sed_52Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_.net_53 get  { return data; }

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_microsoft_54 }

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_microsoft_55}



以下的代码演示了如何实现Execute方法。

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_sed_56public delegate void PageFinishedEventHandler( object sender, PageFinishedEventArgs e );

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_microsoft_57public event PageFinishedEventHandler PageFinished;

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_数据_58

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_自定义_59protected override Status Execute(ActivityExecutionContext context)

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_sed_60Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_sed_61 {

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_sed_62 System.Net.WebClient client = new System.Net.WebClient();

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_sed_63 string pageData;

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_.net_64

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_sed_65 try

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_自定义_66Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_自定义_67  {

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_.net_68 // Download the web page data

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_microsoft_69 pageData = client.DownloadString(WebPage);

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_自定义_70 }

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_microsoft_71 catch (Exception e)

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_数据_72Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_.net_73  {

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_sed_74 pageData = e.Message;

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_.net_75 }

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_数据_76

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_数据_77 // Raise the PageFinished event back to the host

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_sed_78 PageFinished(null, new PageFinishedEventArgs(pageData));

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_自定义_79

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_microsoft_80 // Notifiy the runtime that the activity has finished

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_自定义_81 return Status.Closed;

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_.net_82}



为WebTear活动创建顺序工作流。


此时,我们已经创建好了下载网页的自定义活动。现在我们创建一个简单的顺序工作流,来测试一下这个自定义活动的功能。

这个工作流只包含一个活动,就是我们的WebTear活动。要下载的网页地址被传到工作流的Parameters集合中,这个的值用来设置活动的WebPage属性。最后,当活动结束下载后,触发事件,工作流会从事件参数中提取网页数据,并把数据通过Parameters集合中的out参数发回宿主程序。以下代码演示了顺序工作流的实现

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_.net_83using System;

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_.net_84using System.ComponentModel;

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_.net_85using System.Workflow.ComponentModel;

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_数据_86using System.Workflow.ComponentModel.Design;

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_自定义_87using System.Workflow.ComponentModel.Compiler;

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_自定义_88using System.Workflow.Activities;

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_microsoft_89

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_自定义_90namespace Microsoft.Samples.Workflow.Quickstarts.CustomActivity

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_sed_91Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_自定义_92 {

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_microsoft_93 public sealed partial class WebTearActivityWorkflow : SequentialWorkflow

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_自定义_94Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_microsoft_95  {

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_sed_96 private string webSite;

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_.net_97 private WebTear webTear1;

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_microsoft_98

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_sed_99 public WebTearActivityWorkflow()

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_sed_100Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_自定义_101  {

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_.net_102 InitializeComponent();

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_自定义_103 }

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_数据_104

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_数据_105 private void InitializeComponent()

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_自定义_106Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_自定义_107  {

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_自定义_108 System.Workflow.ComponentModel.ActivityBind activitybind1 = new System.Workflow.ComponentModel.ActivityBind();

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_数据_109 System.Workflow.ComponentModel.ParameterDeclaration WebPage = new System.Workflow.ComponentModel.ParameterDeclaration();

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_.net_110 System.Workflow.ComponentModel.ParameterDeclaration PageData = new System.Workflow.ComponentModel.ParameterDeclaration();

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_.net_111 this.webTear1 = new Microsoft.Samples.Workflow.Quickstarts.CustomActivity.WebTear();

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_.net_112 //

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_数据_113 // webTear1

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_数据_114  //

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_microsoft_115 this.webTear1.ID = "webTear1";

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_.net_116 activitybind1.ID = "/Workflow";

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_microsoft_117 activitybind1.Path = "webSite";

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_sed_118 this.webTear1.PageFinished += new Microsoft.Samples.Workflow.Quickstarts.CustomActivity.WebTear.PageFinishedEventHandler(this.webTear1_PageFinished);

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_microsoft_119 this.webTear1.SetBinding(Microsoft.Samples.Workflow.Quickstarts.CustomActivity.WebTear.WebPageProperty, ((System.Workflow.ComponentModel.Bind)(activitybind1)));

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_数据_120 //

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_自定义_121 // WebTearActivityWorkflow

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_microsoft_122 //

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_自定义_123 this.Activities.Add(this.webTear1);

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_sed_124 this.DynamicUpdateCondition = null;

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_microsoft_125 this.ID = "WebTearActivityWorkflow";

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_sed_126 WebPage.Direction = System.Workflow.ComponentModel.ParameterDirection.In;

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_自定义_127 WebPage.Name = "WebPage";

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_自定义_128 WebPage.Type = typeof(System.String);

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_sed_129 WebPage.Value = null;

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_microsoft_130 PageData.Direction = System.Workflow.ComponentModel.ParameterDirection.Out;

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_数据_131 PageData.Name = "PageData";

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_.net_132 PageData.Type = typeof(System.String);

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_数据_133 PageData.Value = null;

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_microsoft_134 this.Parameters.Add(WebPage);

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_数据_135 this.Parameters.Add(PageData);

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_数据_136 this.Initialized += new System.EventHandler(this.InitVars);

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_microsoft_137

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_数据_138 }

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_microsoft_139

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_microsoft_140 private void InitVars(object sender, EventArgs e)

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_microsoft_141Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_microsoft_142  {

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_数据_143 webSite = this.Parameters["WebPage"].Value.ToString();

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_.net_144 }

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_sed_145

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_自定义_146 private void webTear1_PageFinished(object sender, PageFinishedEventArgs e)

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_自定义_147Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_自定义_148  {

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_.net_149 this.Parameters["PageData"].Value = e.Data;

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_自定义_150 }

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_自定义_151 }

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_自定义_152}



创建宿主程序


这里的宿主程序是一个Winform程序,它有一个TextBox来输入要下载的url,当点击Go按钮,工作流开始运行,并执行WebTear活动开始下载网页。工作流运行完后,宿主程序从WorkflowCompleteEventArgs对象中获得网页数据,并把它显示在另一个TextBox中。以下代码演示了如何实现宿主程序(译者注:私自去掉了不重要的代码,要看完整的自个儿去msdn上找,呵呵)。

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_自定义_153……

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_数据_154

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_自定义_155namespace Microsoft.Samples.Workflow.Quickstarts.CustomActivity

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_自定义_156Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_.net_157 {

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_数据_158 public class MainForm : Form

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_.net_159Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_.net_160  {

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_数据_161 private System.Windows.Forms.Label addressCaption;

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_sed_162 private System.Windows.Forms.TextBox address;

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_.net_163 private System.Windows.Forms.TextBox data;

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_自定义_164 private System.Windows.Forms.Button goButton;

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_.net_165

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_sed_166 private WorkflowRuntime workflowRuntime;

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_数据_167

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_microsoft_168 public MainForm()

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_数据_169Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_sed_170  {

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_数据_171 InitializeComponent();

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_sed_172

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_数据_173 workflowRuntime = new WorkflowRuntime();

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_数据_174 workflowRuntime.StartRuntime();

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_数据_175

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_.net_176 workflowRuntime.WorkflowCompleted += new EventHandler<WorkflowCompletedEventArgs>(workflowRuntime_WorkflowCompleted);

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_microsoft_177 }

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_microsoft_178

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_自定义_179 void workflowRuntime_WorkflowCompleted(object sender, WorkflowCompletedEventArgs e)

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_自定义_180Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_.net_181  {

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_microsoft_182 // Retrieve the downloaded page data

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_sed_183 if (data.InvokeRequired)

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_数据_184 data.Invoke(new EventHandler<WorkflowCompletedEventArgs>(workflowRuntime_WorkflowCompleted), sender, e);

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_microsoft_185 else

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_.net_186 data.Text = e.OutputParameters["PageData"].ToString();

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_sed_187 }

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_sed_188

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_microsoft_189 private void goButton_Click(object sender, EventArgs e)

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_自定义_190Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_.net_191  {

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_自定义_192 Type type = typeof(Microsoft.Samples.Workflow.Quickstarts.CustomActivity.WebTearActivityWorkflow);

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_microsoft_193

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_sed_194 // Sending the data to the workflow.

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_microsoft_195 // First create the required property set

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_microsoft_196 Dictionary<string, object> properties = new Dictionary<string, object>();

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_.net_197 properties.Add("WebPage", address.Text);

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_.net_198 properties.Add("PageData", "");

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_microsoft_199

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_数据_200 workflowRuntime.StartWorkflow(type, properties);

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_sed_201 }

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_自定义_202

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_sed_203 ……

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_.net_204 }

Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)_sed_205}