任务 1:创建自定义活动

在此任务中,创建 WebTearActivity 类。 此类从 Activity 类派生。

当包含自定义活动的工作流启动时,Windows 工作流运行时引擎将调用重写的 Execute 方法,并传递 ActivityExecutionContext 对象作为参数。

当创建 WebTear 活动时,将在可提供自定义数据的类中创建一个 DependencyProperty 对象。活动必须具有这些自定义数据才能完成处理。 在此活动中使用的 DependencyProperty 对象是 String 对象。 该对象用于 Web 页 URL。

备注

虽然建议您按顺序进行下列练习,但并不要求您这么做。 您可以通过打开示例项目并执行下节中的步骤来开始此练习。

在 Visual Studio 中创建 WebTear 自定义活动源文件

  • 在“解决方案资源管理器”中,右击 CustomActivity 项目,单击“添加”和“新建项”。 选择“类”并将其名称更改为 WebTearActivity。

使用文本编辑器创建 WebTear 自定义活动源文件

  1. 在项目目录中,创建一个名为 WebTearActivity 的新文件。

    如果要创建 C# 应用程序,请为该文件指定 .cs 扩展名;如果要创建 Visual Basic 应用程序,请为文件指定 .vb 扩展名。

  2. 在主项目文件 (CustomActivity) 中,在最后一个 ItemGroup 元素中添加新的 Compile 元素。

  3. Compile 元素添加一个名为 Include 的新属性。

  4. 使用在步骤 1 中创建的文件名作为属性值。

  5. 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 类中声明

  1. 在 WebTearActivity 文件中,添加下列命名空间指令以导入必须具有的用于工作流的类型。

    using System;
    using System.ComponentModel;
    using System.Workflow.ComponentModel;
    using System.Workflow.ComponentModel.Design;
    
  2. 在从 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 事件

  1. WebTearActivity 类中,创建一个名为 PageFinishedEventHandler 的新的 delegate,它可接受名为 senderObject 参数和名为 e 的 PageFinishedEventArgs 参数。

    备注

    在步骤 3 中创建 PageFinishedEventArgs。

    public delegate void PageFinishedEventHandler(object sender,
        PageFinishedEventArgs e);
    
  2. WebTearActivity 类中,创建一个名为 pageFinishedEvent 的新的私有 PageFinishedEventHandler 事件。

  3. WebTearActivity 类中,创建一个名为 PageFinished 的公共 PageFinishedEventHandler 事件属性。

  4. 在 PageFinished 事件属性中,创建 add 和 remove 访问器以便在 pageFinishedEvent 事件中添加和移除事件处理程序。

    private event PageFinishedEventHandler pageFinishedEvent;
    public event PageFinishedEventHandler PageFinished
    {
        add
        {
            pageFinishedEvent += value;
        }
        remove
        {
            pageFinishedEvent -= value;
        }
    }
    
  5. Microsoft.Samples.Workflow.Tutorials.CustomActivity namespace 中创建一个名为 PageFinishedEventArgs 的新类。

    此类可以在与 WebTearActivity 类(遵循 WebTearActivity 类定义)相同的源文件中进行定义。

    Public Class PageFinishedEventArgs
    End Class
    
    public class PageFinishedEventArgs
    {
    }
    
  6. PageFinishedEventArgs 类中,声明一个名为 pageData 的私有 String 字段。

    private string pageData;
    
  7. PageFinishedEventArgs 类中,创建一个名为 Data 的公共 String 属性。

    在此属性中,创建一个获取方法以返回在上一步骤中创建的 pageData 字段的值。

    public string Data
    {
        get { return this.pageData; }
    }
    
  8. PageFinishedEventArgs 类中,创建一个公共构造函数以接收一个名为 data 的 String 参数。

    在构造函数体中,将在 PageFinishedEventArgs 类中定义的 pageData 字段设置为等于 data 参数的值。

    public PageFinishedEventArgs(string data)
    {
        this.pageData = data;
    }
    

定义 URL DependencyProperty

  1. WebTearActivity 类中,创建一个名为 UrlProperty 的新的公共静态 DependencyProperty 字段。

    将此字段设置为等于 Register 静态方法的返回值,并将字符串 "Url"、String 类的类型和 WebTearActivity 类的类型,作为参数传递给 Register 方法。

    public static DependencyProperty UrlProperty =
                DependencyProperty.Register("Url",
                typeof(System.String),
                typeof(WebTearActivity));
    
  2. WebTearActivity 类中,创建一个名为 Url 的公共字符串属性。

  3. DesignerSerializationVisibilityAttribute 应用到 WebTearActivity 类中的 Url 属性,并将 Visible 值作为参数传递给 DesignerSerializationVisibilityAttribute

  4. BrowsableAttribute 应用到 WebTearActvity 类中的 Url 属性,并将 true 作为参数传递给 BrowsableAttribute

  5. DescriptionAttribute 应用到 WebTearActvity 类中的 Url 属性,并将字符串 "Url to download" 作为参数传递给 DescriptionAttribute

  6. CategoryAttribute 应用到 WebTearActvity 类中的 Url 属性,并将字符串 "WebTearActivity Property" 作为参数传递给 CategoryAttribute

  7. 定义 Url 属性的 get 方法。

  8. get 方法体中,返回通过调用 GetValue 基类方法接收的值,并传递 UrlProperty 作为要检索的值。

  9. 定义 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 方法

  1. WebTearActivity 类中,重写 Execute 基类方法。

  2. Execute 方法中,创建一个名为 pageData 的局部 String 变量。

  3. 创建一个名为 client 的局部 WebClient 变量,并创建该对象的实例。

  4. 创建 try 块。

    在创建的块体中,调用 client 对象的 DownloadString 方法,并传递类的 Url 属性作为参数。

  5. 在上一步骤中创建的 try 块的后面,创建一个用于 Exception 异常的 catch 块。

    catch 块体中,将 pageData 字段设置为等于异常的 Message 属性。

  6. 引发在 WebTearActivity 类中定义的 PageFinished 事件,并传递以下内容作为参数:

    • null(在 Visual Basic 中为 Nothing)。

    • 一个新的、使用 pageData 作为构造函数参数的 PageFinishedEventArgs 对象。

  7. 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:在顺序工作流中使用自定义活动中,将刚创建的自定义活动添加到顺序工作流中。

请参见

任务

任务 2:在顺序工作流中使用自定义活动

参考

Activity
Execute
ActivityExecutionContext
DependencyProperty
ActivityToolboxItem
Register
DependencyProperty

其他资源

教程:创建自定义活动

Footer image

版权所有 (C) 2007 Microsoft Corporation。保留所有权利。