如何:创建活动

活动是 WF 中的核心行为单元。 活动的执行逻辑可以使用托管代码实现,也可以使用其他活动实现。 本主题演示如何创建两个活动。 第一个活动是简单活动,它使用代码来实现其执行逻辑。 第二个活动的实现是用其他活动定义的。 后续教程步骤会使用这些活动。

创建活动库项目

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

  2. 在“新建项目”对话框中的“已安装”类别下,选择“Visual C#”>“Workflow”(或“Visual Basic”>“Workflow”)。

    注意

    如果未看到 Workflow 模板类别,可能需要安装 Visual Studio 的 Windows Workflow Foundation 组件。 选择“新建项目”对话框左侧的“打开 Visual Studio 安装程序”链接。 在 Visual Studio 安装程序中,选择“单个组件”选项卡。然后,在“开发活动”类别下,选择“Windows Workflow Foundation”组件。 选择“修改”以安装组件。

  3. 选择“活动库”项目模板。 在“名称”框中键入 NumberGuessWorkflowActivities,然后单击“确定”。

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

创建 ReadInt 活动

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

  2. 在“已安装”>“常用项”节点中,选择“Workflow”。 从“Workflow”列表中选择“代码活动”。

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

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

    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 (string.IsNullOrEmpty(name))
            {
                throw new ArgumentException("BookmarkName cannot be an Empty string.",
                    "context");
            }
    
            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));
        }
    }
    
    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
    

    注意

    ReadInt 活动派生自 NativeActivity<TResult> 而不是 CodeActivity,这是默认的代码活动模板。 如果活动提供单个结果,可以使用 CodeActivity<TResult>,它是通过 Result 自变量公开的,但是 CodeActivity<TResult> 不支持使用书签,因此使用 NativeActivity<TResult>

创建 Prompt 活动

  1. 按 Ctrl+Shift+B 生成项目。 通过生成项目,可以使用此项目中的 ReadInt 活动生成此步骤中的自定义活动。

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

  3. 在“已安装”>“常用项”节点中,选择“Workflow”。 从“工作流”列表中选择“活动”

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

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

  6. 单击活动设计器左下角的“参数”,显示“参数”窗格。

  7. 单击“创建参数”

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

  9. 单击“创建参数”

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

  11. 单击“创建参数”

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

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

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

  14. 从“工具箱”的“控制流”部分中,将 Sequence 活动拖到 Prompt 活动设计器的“在此处放置活动”标签上。

    提示

    如果未显示“工具箱”窗口,请从“视图”菜单中选择“工具箱”

  15. 从“工具箱”的“基元”部分中,将 WriteLine 活动拖到 Sequence 活动设计器的“在此处放置活动”标签上。

  16. 将 WriteLine 活动的 Text 参数绑定到 Prompt 活动的 Text 参数,方法是在“属性”窗口中的“输入 C# 表达式”框或者“输入 VB 表达式”框中键入 Text,然后按 Tab 键两次。 这会关闭 IntelliSense 列表成员窗口,并通过将选择范围移离属性保存属性值。 通过在活动本身的“输入 C# 表达式”或“输入 VB 表达式”框中键入 Text,也可以设置此属性。

    提示

    如果未显示“属性”窗口,请从“视图”菜单中选择“属性窗口”。

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

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

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

  20. 按 CtrlShiftB 以生成解决方案。

后续步骤

有关如何使用这些活动创建工作流的说明,请参见教程如何:创建工作流的下一步骤。

另请参阅