在工作流设计器中定义和使用活动委托
.NET Framework 4.5 包括用于 InvokeDelegate 活动的现成可用的设计器。 此设计器可用于将委托分配给从 ActivityDelegate 派生的活动,例如 ActivityAction 或 ActivityFunc<TResult>。
定义活动委托
创建新的“工作流控制台应用程序”项目。
注意
如果不想查看“工作流”项目模板,请首先安装 Visual Studio 的 Windows Workflow Foundation 组件。 有关详细说明,请参阅安装 Windows Workflow Foundation。
在“解决方案资源管理器”中右键单击该项目,然后选择“添加”>“新建项”。 选择“工作流”类别,然后选择“活动”项模板。 将新活动命名为 MyForEach.xaml,然后选择“确定”。
活动将在工作流设计器中打开。
在工作流设计器中,单击“参数”选项卡。
单击“创建参数”。 将新参数命名为 Items。
在“参数类型”列中,选择“[T] 数组”。
在类型浏览器中,选择“对象”,然后选择“确定”。
再次单击“创建参数”。 将新参数命名为 Body。 在新参数的“方向”列中,选择“属性”。
在“参数类型”列中,选择“浏览类型”
在类型浏览器中,在“类型名称”字段中输入 ActivityAction。 在树视图中选择“ActivityAction<T>”。 在显示的下拉列表中选择“对象”,将类型 ActivityAction<Object> 分配给参数。
将 While 活动从工具箱的“控制流”部分拖放到设计器图面中。
选择 While 活动,然后选择“变量”选项卡。
选择“创建变量”。 将新变量命名为 Index。
在“变量类型”列中,选择“Int32”。 将“范围”保留为“While”,将“默认值”列保留为空。
将 While 活动的“条件”属性设置为“index < Items.Length;”。
将 InvokeDelegate 活动从工具箱的“基元”部分拖放到 While 活动的“正文”。
在委托下拉列表中选择“正文”。
在 InvokeDelegate 活动的“属性”网格中,单击“委托参数”属性中的“…”按钮。
在命名为“Argument”的参数的“值”列中,输入 Items[Index]。 单击“确定”以关闭“DelegateArguments”对话框。
将 Assign 活动拖到 InvokeDelegate 活动的水平线下。 将创建 Assign 活动,并且将自动创建 Sequence 活动以包含 MyForEach 活动的“正文”部分中的两个活动。 需要序列,因为“正文”部分只能包含一个活动。 自动创建新的 Sequence 活动是 .NET Framework 4.5 的一个新功能。
将 Assign 活动的“到”属性设置为“index”。 将“Assign”活动的“值”属性设置为“index+1”。
自定义 MyForEach 活动为通过 Items 集合(集合中的值作为活动的输入)传递给它的每个值调用一次任意活动。
使用工作流中的自定义活动
按 Ctrl+Shift+B 生成项目。
在“解决方案资源管理器”中,打开设计器中的“Workflow1.xaml”。
将“MyForEach”活动从工具箱拖到设计器图面。 该活动位于工具箱的某个部分,其名称与项目名称相同。
将 MyForEach 活动的“项”属性设置为“new Object[] {1, "abc"}”。
将 WriteLine 活动从工具箱的“基元”部分拖放到 MyForEach 活动的“Delegate:Body”部分。
将 WriteLine 活动的“文本”属性设置为“Argument.ToString()”。
当执行工作流时,控制台将显示以下输出:
1abc