使用 DynamicActivity 在运行时创建活动
DynamicActivity 是一个带有公共构造函数的具体的密封类。 通过使用活动 DOM,DynamicActivity 可用于在运行时组合活动功能。
DynamicActivity 功能
DynamicActivity 有权访问执行属性、自变量和变量,但无权访问运行时服务(例如安排子活动或跟踪)。
使用工作流 Argument 对象可以设置顶级属性。 在命令性代码中,使用新类型的 CLR 属性创建这些参数。 在 XAML 中,使用 x:Class
和 x:Member
标记声明这些参数。
使用 DynamicActivity 构造的活动使用 ICustomTypeDescriptor 与设计器交互。 可以使用 Load 动态加载在设计器中创建的活动,如下面的过程所示。
使用命令性代码在运行时创建活动
打开 Visual Studio 2010。
依次选择“文件”、“新建”和“项目”。 在“项目类型”窗口中的“Visual C#”下,选择“Workflow 4.0”,然后选择“v2010”节点。 在“模板”窗口中,选择“顺序工作流控制台应用程序”。 将新项目命名为 DynamicActivitySample。
右键单击 HelloActivity 项目中的 Workflow1.xaml,然后选择“删除”。
打开 Program.cs。 将下面的指令添加到文件的顶部。
using System.Collections.Generic;
将
Main
方法的内容替换为以下代码,这会创建一个包含单个 Sequence 活动的 WriteLine 活动,并将后者赋给新动态活动的 Implementation 属性。//Define the input argument for the activity var textOut = new InArgument<string>(); //Create the activity, property, and implementation Activity dynamicWorkflow = new DynamicActivity() { Properties = { new DynamicActivityProperty { Name = "Text", Type = typeof(InArgument<String>), Value = textOut } }, Implementation = () => new Sequence() { Activities = { new WriteLine() { Text = new InArgument<string>(env => textOut.Get(env)) } } } }; //Execute the activity with a parameter dictionary WorkflowInvoker.Invoke(dynamicWorkflow, new Dictionary<string, object> { { "Text", "Hello World!" } }); Console.ReadLine();
执行应用程序。 此时将显示带有“Hello World!”文本的控制台窗口。
使用 XAML 在运行时创建活动
打开 Visual Studio 2010。
依次选择“文件”、“新建”和“项目”。 在“项目类型”窗口中的“Visual C#”下,选择“Workflow 4.0”,然后选择“v2010”节点。 在“模板”窗口中,选择“工作流控制台应用程序”。 将新项目命名为 DynamicActivitySample。
在 HelloActivity 项目中打开 Workflow1.xaml。 单击设计器底部的“参数”选项。 创建一个
In
类型的新TextToWrite
自变量,并将其命名为String
。将“WriteLine”活动从工具箱的“基元”部分拖放到设计器图面中。 将值
TextToWrite
赋给活动的“文本”属性。打开 Program.cs。 将下面的指令添加到文件的顶部。
using System.Activities.XamlIntegration;
将
Main
方法的内容替换为以下代码。Activity act2 = ActivityXamlServices.Load(@"Workflow1.xaml"); results = WorkflowInvoker.Invoke(act2, new Dictionary<string, object> { { "TextToWrite", "HelloWorld!" } }); Console.ReadLine();
执行应用程序。 此时将显示带有“Hello World!”文本的控制台窗口。
在“解决方案资源管理器”中,右键单击 Workflow1.xaml 文件,然后选择“查看代码”。 请注意,活动类使用
x:Class
创建,属性使用x:Property
创建。