如何:创建活动

本主题适用于 Windows Workflow Foundation 4。

活动是 WF 中的核心行为单元。一个活动的执行逻辑既可以使用托管代码实现,也可以使用其他活动实现。本主题演示如何创建一个简单的活动(通过使用代码来实现其执行逻辑)以及如何创建一个通过其他活动来定义其实现的活动。在接下来的如何:创建工作流如何:运行工作流主题中将会使用这些活动。

创建活动库项目

  1. 打开 Visual Studio 2010,然后从**“文件”菜单中依次选择“新建”“项目”**。

  2. 在**“已安装的模板”列表中,展开“其他项目类型”节点,然后选择“Visual Studio 解决方案”**。

  3. 从**“Visual Studio 解决方案”列表中选择“空白解决方案”。请确保在 .NET Framework 版本下拉列表中选择“.NET Framework 4”。在“名称”框中键入 GettingStartedTutorial,然后单击“确定”**。

  4. 在**“解决方案资源管理器”中右击“GettingStartedTutorial”,然后依次选择“添加”“新建项目”**。

    Dd489453.Tip(zh-cn,VS.100).gif提示:
    如果未显示“解决方案资源管理器”窗口,请从“视图”菜单选择“解决方案资源管理器

  5. 在**“已安装模板”列表中,依次选择“Visual C#”“工作流”(或依次选择“Visual Basic”“工作流”)。请确保在 .NET Framework 版本下拉列表中选择“.NET Framework 4”。从“工作流”列表中选择“活动库”。保留默认设置,然后单击“确定”**。

    Dd489453.note(zh-cn,VS.100).gif注意:
    根据在 Visual Studio 中配置为主要语言的编程语言的不同,“Visual C#”“Visual Basic”节点可能位于“安装模板”列表下的“其他语言”节点中。

  6. 在**“解决方案资源管理器”中右击“Activity1.xaml”,然后选择“删除”。单击“确定”**以确认。

创建 ReadInt 活动

  1. 从**“项目”菜单中选择“添加新项”**。

  2. 在**“已安装模板”列表中,选择“工作流”。从“工作流”列表中选择“代码活动”**。

  3. 在**“名称”框中键入 ReadInt,然后单击“添加”**。

  4. 将现有的 ReadInt 定义替换为下面的定义。

    Public NotInheritable Class ReadInt
        Inherits NativeActivity(Of Integer)
    
        <RequiredArgument()>
        Property BookmarkName() As InArgument(Of String)
    
        Protected Overrides Sub Execute(ByVal context As NativeActivityContext)
            Dim name As String
            name = BookmarkName.Get(context)
    
            If name = String.Empty Then
                Throw New ArgumentException("BookmarkName cannot be an Empty string.",
                    "BookmarkName")
            End If
    
            context.CreateBookmark(name, New BookmarkCallback(AddressOf OnReadComplete))
        End Sub
    
        ' NativeActivity derived activities that do asynchronous operations by calling 
        ' one of the CreateBookmark overloads defined on System.Activities.NativeActivityContext 
        ' must override the CanInduceIdle property and return True.
        Protected Overrides ReadOnly Property CanInduceIdle As Boolean
            Get
                Return True
            End Get
        End Property
    
        Sub OnReadComplete(ByVal context As NativeActivityContext, ByVal bookmark As Bookmark, ByVal state As Object)
            Result.Set(context, Convert.ToInt32(state))
        End Sub
    
    End Class
    
    public sealed class ReadInt : NativeActivity<int>
    {
        [RequiredArgument]
        public InArgument<string> BookmarkName { get; set; }
    
        protected override void Execute(NativeActivityContext context)
        {
            string name = BookmarkName.Get(context);
    
            if (name == string.Empty)
            {
                throw new ArgumentException("BookmarkName cannot be an Empty string.",
                    "BookmarkName");
            }
    
            context.CreateBookmark(name, new BookmarkCallback(OnReadComplete));
        }
    
        // NativeActivity derived activities that do asynchronous operations by calling 
        // one of the CreateBookmark overloads defined on System.Activities.NativeActivityContext 
        // must override the CanInduceIdle property and return true.
        protected override bool CanInduceIdle
        {
            get { return true; }
        }
    
        void OnReadComplete(NativeActivityContext context, Bookmark bookmark, object state)
        {
            this.Result.Set(context, Convert.ToInt32(state));
        }
    }
    
    Dd489453.note(zh-cn,VS.100).gif注意:
    ReadInt 活动从 NativeActivity 而不是从 CodeActivity(它是基于代码活动的活动项目的默认值)派生。如果活动提供了单个结果(它通过 Result 参数公开),则可以使用 CodeActivity,但是 CodeActivity 不支持使用书签,因此使用 NativeActivity

创建 Prompt 活动

  1. 按 F6 以生成项目。如此便能在此项目中使用 ReadInt 活动以通过此步骤生成自定义活动。

  2. 从**“项目”菜单中选择“添加新项”**。

  3. 在**“已安装模板”列表中,选择“工作流”。从“工作流”列表中选择“活动”**。

  4. 在**“名称”框中键入 Prompt,然后单击“添加”**。

  5. 如果设计器中尚未显示**“Prompt.xaml”工作流,请在“解决方案资源管理器”**中双击该工作流,使其显示在设计器中。

  6. 单击活动设计器左下方的**“参数”按钮,以显示“参数”**窗格。

  7. 单击**“创建参数”**。

  8. 在**“名称”框中键入 BookmarkName,从“方向”下拉列表中选择“输入”,再从“参数类型”下拉列表中选择“String”**,然后按 Enter 保存该参数。

  9. 单击**“创建参数”**。

  10. 在新添加的 BookmarkName 参数下方的**“名称”框中键入 Result,从“方向”下拉列表中选择“输出”,再从“参数类型”下拉列表中选择“Int32”**,然后按 Enter。

  11. 单击**“创建参数”**。

  12. 在**“名称”框中键入 Text,从“方向”下拉列表中选择“输入”,再从“参数类型”下拉列表中选择“String”**,然后按 Enter 保存该参数。

    在以下步骤中,这三个参数将绑定到添加到 Prompt 活动中的 WriteLineReadInt 活动的相应参数。

  13. 单击活动设计器左下方的**“参数”,以关闭“参数”**窗格。

  14. 将**“Sequence”活动从“工具箱”“控制流”**部分拖放到活动设计器。

    Dd489453.Tip(zh-cn,VS.100).gif提示:
    如果“工具箱”窗口未显示,请从“视图”菜单中选择“工具箱”

  15. 将**“WriteLine”活动从“工具箱”“基元”部分拖放到“Sequence”**活动中。

  16. 将**“WriteLine”活动的“Text”参数绑定到“Prompt”活动的“Text”参数,方法是在“属性”窗口的“输入 VB 表达式”框中键入 Text,然后按 Tab 键两次以关闭 IntelliSense“列出成员”窗口,并通过将所选内容从该属性中移出来保存该属性值。还可以通过在活动本身上的“输入 VB 表达式”**框中键入 Text 来设置此属性。

    Dd489453.Tip(zh-cn,VS.100).gif提示:
    如果“属性窗口”窗口未显示,请从“视图”菜单中选择“属性窗口”

  17. 将**“ReadInt”活动从“工具箱”“ActivityLibrary1”部分拖放到“Sequence”活动中,以便它位于“WriteLine”**活动之后。

  18. 将**“ReadInt”活动的“BookmarkName”参数绑定到“Prompt”活动的“BookmarkName”参数,方法是在“属性窗口”“BookmarkName”参数右侧的“输入 VB 表达式”**框中键入 BookmarkName,然后按 Tab 键两次以关闭 IntelliSense“列出成员”窗口并保存该属性。

  19. 将**“ReadInt”活动的“Result”参数绑定到“Prompt”活动的“Result”参数,方法是在“属性窗口”“Result”参数右侧的“输入 VB 表达式”**框中键入 Result,然后按 Tab 键两次。

  20. 按 F6 生成解决方案。

另请参见

任务

如何:创建工作流

参考

CodeActivity
NativeActivity

概念

设计和实现自定义活动

其他资源

入门教程