工作流可基于内置活动以及自定义活动来构造。 本主题分步介绍如何创建使用内置活动(如 StateMachine 活动)以及之前的如何:创建活动中的自定义活动的工作流。 该工作流模拟猜数游戏。
注意
入门教程中的每个主题都依赖于前面的主题。 若要完成本主题,必须先完成如何:创建活动。
创建工作流
在解决方案资源管理器中右键单击“NumberGuessWorkflowActivities”,并依次选择“添加”、“新建项目”。
在“已安装”、“常用项”节点中,选择“工作流”。 从“工作流”列表中选择“活动”。
在“名称”框中键入
StateMachineNumberGuessWorkflow,然后单击“确定”。从“工具箱”的“状态机”部分中,将“StateMachine”活动拖放到工作流设计图面上的“在此处放置活动”标签上。
创建工作流变量和自变量
如果设计器中尚未显示“StateMachineNumberGuessWorkflow.xaml”工作流,请在解决方案资源管理器中双击该工作流,使其显示在设计器中。
单击工作流设计器左下方的“参数”,以显示“参数”窗格。
单击“创建参数”。
在“名称”框中键入
MaxNumber,从“方向”下拉列表中选择“输入”,从“参数类型”下拉列表中选择“Int32”,然后按 Enter 保存参数。单击“创建参数”。
在新添加的
MaxNumber参数下方的“名称”框中键入Turns,从“方向”下拉列表中选择“向外”,再从“参数类型”下拉列表中选择“Int32”,然后按 Enter。单击活动设计器左下角的“参数”,关闭“参数”窗格。
单击工作流设计器左下方的“变量”,以显示“变量”窗格。
单击“创建变量”。
提示
如果未显示“创建变量”框,请单击工作流设计器图面上的 StateMachine 活动以将其选中。
在“名称”框中键入
Guess,从“变量类型”下拉列表中选择“Int32”,然后按 Enter 保存该变量。单击“创建变量”。
在“名称”框中键入
Target,从“变量类型”下拉列表中选择“Int32”,然后按 Enter 保存该变量。单击活动设计器左下角的“变量”,关闭“变量”窗格。
添加工作流活动
单击“State1”将其选中。 在“属性窗口”中,将“DisplayName”更改为
Initialize Target。提示
如果未显示“属性”窗口,请从“视图”菜单中选择“属性窗口”。
在工作流设计器中双击刚刚重命名的“Initialize Target”状态,以将其展开。
将“Assign”活动从“工具箱”的“基元”部分拖放至状态的“输入”部分。 在“到”框中键入
Target,并在“输入 C# 表达式”或“输入 VB 表达式”框中键入以下表达式。New System.Random().Next(1, MaxNumber + 1)new System.Random().Next(1, MaxNumber + 1)提示
如果未显示“工具箱”窗口,请从“视图”菜单中选择“工具箱”。
通过单击工作流设计器顶部的痕迹显示中的“StateMachine”,返回到工作流设计器中的整体状态机视图。
从“工具箱”的“状态机”部分,将一个“State”活动拖动到工作流设计器上,并将其悬停在“Initialize Target”状态上。 请注意,当新状态悬停在其上时,“Initialize Target”状态周围会出现四个三角形。 将新状态放到“Initialize Target”状态下面紧邻的三角形上。 此操作将新状态放置到工作流,并创建从“Initialize Target”状态到新状态的转换。
单击“State1”以选择它,将“DisplayName”更改为
Enter Guess,然后双击工作流设计器中的状态,以将其展开。将“WriteLine”活动从“工具箱”的“基元”部分拖放至状态的“输入”部分上。
将以下表达式键入“WriteLine”的“文本”属性框中。
"Please enter a number between 1 and " & MaxNumber"Please enter a number between 1 and " + MaxNumber将“Assign”活动从“工具箱”的“基元”部分拖放至状态的“退出”部分。
在“到”框中键入
Turns,并将Turns + 1键入“输入 C# 表达式”或“输入 VB 表达式”框中。通过单击工作流设计器顶部的痕迹显示中的“StateMachine”,返回到工作流设计器中的整体状态机视图。
从“工具箱”的“状态机”部分拖动一个“FinalState”活动,将其悬停在“Enter Guess”状态上,并将其放到“Enter Guess”状态右侧显示的三角形上,以便在“Enter Guess”和“FinalState”之间创建转换。
转换的默认名称为 T2。 在工作流设计器中单击该转换将其选中,并将其“DisplayName”设置为“Guess Correct”。 然后单击并选择“FinalState”将其拖至右侧,以便留出空间显示完整的转换名称,而不会覆盖这两个状态中的任何一个。 这样可以方便完成本教程中的剩余步骤。
在工作流设计器中双击刚刚重命名的“Guess Correct”转换,以将其展开。
将“ReadInt”活动从“工具箱”的“NumberGuessWorkflowActivities”部分拖放至转换的“触发器”部分。
在“ReadInt”活动的“属性窗口”中,将
"EnterGuess"(包括引号)键入“BookmarkName”属性值框中,并将Guess键入“Result”属性值框中将以下表达式键入“Guess Correct”转换的“Condition”属性值框中。
Guess = TargetGuess == Target通过单击工作流设计器顶部的痕迹显示中的“StateMachine”,返回到工作流设计器中的整体状态机视图。
注意
当收到触发器事件和 Condition(如果存在)时,将发生转换,计算结果为
True。 对于这一转换,如果用户的Guess匹配随机生成的Target,则将控制传递给“FinalState”并且工作流完成。根据猜测是否正确,工作流应转换到“FinalState”或返回到另一尝试的“Enter Guess”状态。 这两个转换共享同一触发器,等待用户通过“ReadInt”活动接收猜测值。 这称为共享转换。 要创建共享转换,请单击圆圈,以指示“Guess Correct”转换的开始,并将它拖动到所需的状态。 本例中的转换属自行转换,因此拖动“Guess Correct”转换的起始点并将其放回“Enter Guess”状态的底部。 创建转换后,在工作流设计器中选中该转换,并将其“DisplayName”属性设置为“Guess Incorrect”。
注意
也可以通过单击转换设计器底部的“添加共享的触发器转换”,再选择“连接的可用状态”下列表中的所需目标状态,在转换设计器中创建共享转换。
注意
注意,如果转换的 Condition 计算结果为
false(或所有共享触发转换条件的计算结果均为false),转换将不发生,并且此状态下的所有转换的所有触发将被重新计划。 在本教程中,由于配置条件的方式,这种情况不会发生(我们针对猜测是正确或者错误提供了具体的操作)。在工作流设计器中双击“Guess Incorrect”转换,以将其展开。 请注意,“触发器”已设置为相同的“ReadInt”活动,该活动由“Guess Correct”转换使用。
将以下表达式键入“Condition”属性值框。
Guess <> TargetGuess != Target将“If”活动从“工具箱”的“控制流”部分拖放至转换的“操作”部分。
将以下表达式键入“If”活动的“Condition”属性值框。
Guess < Target从“工具箱”的“基元”部分拖放两个“WriteLine”活动,一个放在“If”活动的“Then”部分,另一个放在“Else”部分。
单击“Then”部分中的“WriteLine”活动将其选中,然后将以下表达式键入“Text”属性值框中。
"Your guess is too low."单击“Else”部分中的“WriteLine”活动将其选中,然后将以下表达式键入“Text”属性值框中。
"Your guess is too high."通过单击工作流设计器顶部的痕迹显示中的“StateMachine”,返回到工作流设计器中的整体状态机视图。
下面的示例阐释已完成的工作流。

生成工作流
按 CTRL+SHIFT+B 生成解决方案。
有关如何运行工作流的说明,请参见下一主题,即如何:运行工作流。 如果已使用不同样式的工作流完成如何:运行工作流步骤,并希望使用此步骤中的状态机工作流来运行该工作流,请跳到如何:运行工作流的生成并运行应用程序部分。