任务 1:创建自定义活动
在此任务中,创建 WebTearActivity 类。 此类从 Activity 类派生。
当包含自定义活动的工作流启动时,Windows 工作流运行时引擎将调用重写的 Execute 方法,并传递 ActivityExecutionContext 对象作为参数。
当创建 WebTear 活动时,将在可提供自定义数据的类中创建一个 DependencyProperty 对象。活动必须具有这些自定义数据才能完成处理。 在此活动中使用的 DependencyProperty 对象是 String 对象。 该对象用于 Web 页 URL。
备注
虽然建议您按顺序进行下列练习,但并不要求您这么做。 您可以通过打开示例项目并执行下节中的步骤来开始此练习。
在 Visual Studio 中创建 WebTear 自定义活动源文件
- 在“解决方案资源管理器”中,右击 CustomActivity 项目,单击“添加”和“新建项”。 选择“类”并将其名称更改为 WebTearActivity。
使用文本编辑器创建 WebTear 自定义活动源文件
在项目目录中,创建一个名为 WebTearActivity 的新文件。
如果要创建 C# 应用程序,请为该文件指定 .cs 扩展名;如果要创建 Visual Basic 应用程序,请为文件指定 .vb 扩展名。
在主项目文件 (CustomActivity) 中,在最后一个 ItemGroup 元素中添加新的 Compile 元素。
向 Compile 元素添加一个名为 Include 的新属性。
使用在步骤 1 中创建的文件名作为属性值。
向 Compile 元素添加一个名为 SubType 的新的子元素。
为该元素赋予 Component 值。 ItemGroup 节点如下面的代码中所示。
<ItemGroup> <Compile Include="CustomActivityHost.vb"> <SubType>Form</SubType> </Compile> <Compile Include="WebTearActivity.vb"> <SubType>Component</SubType> </Compile> <Compile Include="WebTearWorkflow.vb"> <SubType>Component</SubType> </Compile> </ItemGroup>
<ItemGroup> <Compile Include="CustomActivityHost.cs"> <SubType>Form</SubType> </Compile> <Compile Include="WebTearActivity.cs"> <SubType>Component</SubType> </Compile> <Compile Include="WebTearWorkflow.cs"> <SubType>Component</SubType> </Compile> </ItemGroup>
在 WebTearActivity 类中声明
在 WebTearActivity 文件中,添加下列命名空间指令以导入必须具有的用于工作流的类型。
using System; using System.ComponentModel; using System.Workflow.ComponentModel; using System.Workflow.ComponentModel.Design;
在从 Activity 派生的 Microsoft.Samples.Workflow.Tutorials.CustomActivity 命名空间中,创建一个名为 WebTearActivity 的新类。
Namespace Microsoft.Samples.Workflow.Tutorials.CustomActivity Public Class WebTearActivity : Inherits System.Workflow.ComponentModel.Activity End Class End Namespace
namespace Microsoft.Samples.Workflow.Tutorials.CustomActivity { public class WebTearActivity : System.Workflow.ComponentModel.Activity { } }
定义 PageFinished 事件
在 WebTearActivity 类中,创建一个名为 PageFinishedEventHandler 的新的 delegate,它可接受名为 sender 的 Object 参数和名为 e 的 PageFinishedEventArgs 参数。
备注
在步骤 3 中创建 PageFinishedEventArgs。
public delegate void PageFinishedEventHandler(object sender, PageFinishedEventArgs e);
在 WebTearActivity 类中,创建一个名为 pageFinishedEvent 的新的私有 PageFinishedEventHandler 事件。
在 WebTearActivity 类中,创建一个名为 PageFinished 的公共 PageFinishedEventHandler 事件属性。
在 PageFinished 事件属性中,创建 add 和 remove 访问器以便在 pageFinishedEvent 事件中添加和移除事件处理程序。
private event PageFinishedEventHandler pageFinishedEvent; public event PageFinishedEventHandler PageFinished { add { pageFinishedEvent += value; } remove { pageFinishedEvent -= value; } }
在 Microsoft.Samples.Workflow.Tutorials.CustomActivity namespace 中创建一个名为 PageFinishedEventArgs 的新类。
此类可以在与 WebTearActivity 类(遵循 WebTearActivity 类定义)相同的源文件中进行定义。
Public Class PageFinishedEventArgs End Class
public class PageFinishedEventArgs { }
在 PageFinishedEventArgs 类中,声明一个名为 pageData 的私有 String 字段。
private string pageData;
在 PageFinishedEventArgs 类中,创建一个名为 Data 的公共 String 属性。
在此属性中,创建一个获取方法以返回在上一步骤中创建的 pageData 字段的值。
public string Data { get { return this.pageData; } }
在 PageFinishedEventArgs 类中,创建一个公共构造函数以接收一个名为 data 的 String 参数。
在构造函数体中,将在 PageFinishedEventArgs 类中定义的 pageData 字段设置为等于 data 参数的值。
public PageFinishedEventArgs(string data) { this.pageData = data; }
定义 URL DependencyProperty
在 WebTearActivity 类中,创建一个名为 UrlProperty 的新的公共静态 DependencyProperty 字段。
将此字段设置为等于 Register 静态方法的返回值,并将字符串 "Url"、String 类的类型和 WebTearActivity 类的类型,作为参数传递给 Register 方法。
public static DependencyProperty UrlProperty = DependencyProperty.Register("Url", typeof(System.String), typeof(WebTearActivity));
在 WebTearActivity 类中,创建一个名为 Url 的公共字符串属性。
将 DesignerSerializationVisibilityAttribute 应用到 WebTearActivity 类中的 Url 属性,并将 Visible 值作为参数传递给 DesignerSerializationVisibilityAttribute。
将 BrowsableAttribute 应用到 WebTearActvity 类中的 Url 属性,并将 true 作为参数传递给 BrowsableAttribute。
将 DescriptionAttribute 应用到 WebTearActvity 类中的 Url 属性,并将字符串 "Url to download" 作为参数传递给 DescriptionAttribute。
将 CategoryAttribute 应用到 WebTearActvity 类中的 Url 属性,并将字符串 "WebTearActivity Property" 作为参数传递给 CategoryAttribute。
定义 Url 属性的 get 方法。
在 get 方法体中,返回通过调用 GetValue 基类方法接收的值,并传递 UrlProperty 作为要检索的值。
定义 Url 属性的 set 方法。
在 set 方法体中,调用 SetValue 基类方法,并传递 UrlProperty 作为要设置的值。
[DesignerSerializationVisibilityAttribute (DesignerSerializationVisibility.Visible)] [BrowsableAttribute(true)] [DescriptionAttribute("Url to download")] [CategoryAttribute("WebTearActivity Property")] public string Url { get { return ((string)(base.GetValue(WebTearActivity.UrlProperty))); } set { base.SetValue(WebTearActivity.UrlProperty, value); } }
定义 Execute 方法
在 WebTearActivity 类中,重写 Execute 基类方法。
在 Execute 方法中,创建一个名为 pageData 的局部 String 变量。
创建一个名为 client 的局部 WebClient 变量,并创建该对象的实例。
创建 try 块。
在创建的块体中,调用 client 对象的 DownloadString 方法,并传递类的 Url 属性作为参数。
在上一步骤中创建的 try 块的后面,创建一个用于 Exception 异常的 catch 块。
在 catch 块体中,将 pageData 字段设置为等于异常的 Message 属性。
引发在 WebTearActivity 类中定义的 PageFinished 事件,并传递以下内容作为参数:
null(在 Visual Basic 中为 Nothing)。
一个新的、使用 pageData 作为构造函数参数的 PageFinishedEventArgs 对象。
从 Execute 方法返回 Closed 以通知 Windows Workflow 运行时引擎活动已完成。 最终的 Execute 方法应与以下代码类似。
protected override ActivityExecutionStatus Execute (ActivityExecutionContext context) { string pageData; System.Net.WebClient client = new System.Net.WebClient(); try { // Download the web page data pageData = client.DownloadString(this.Url); } catch (Exception e) { pageData = e.Message; } // Raise the PageFinished event back to the host pageFinishedEvent(null, new PageFinishedEventArgs(pageData)); // Notifiy the runtime that the activity has finished return ActivityExecutionStatus.Closed; }
编译代码
有关编译代码的信息,请参见编译代码。
在任务 2:在顺序工作流中使用自定义活动中,将刚创建的自定义活动添加到顺序工作流中。
请参见
任务
参考
Activity
Execute
ActivityExecutionContext
DependencyProperty
ActivityToolboxItem
Register
DependencyProperty
其他资源
版权所有 (C) 2007 Microsoft Corporation。保留所有权利。