使用工作流标记
2007-02-28 11:12 Windie Chai 阅读(1302) 评论(0) 编辑 收藏 举报MSDN原文: http://msdn2.microsoft.com/en-us/library/ms735921.aspx
Windows Workflow Foundation 为设计人员和开发人员提供一种创建工作流的途径:通过使用可扩展应用程序标记语言(eXtensible Application Markup Language ,XAML)来创建标记源文件(Markup Source Files). 这些标记文件作为工作流类型在运行时直接被工作流引擎加载.标记文件还可以采用代码分离(使用C#或者VB)的方式被编译成为工作流类型. 这意味着工作流标记文件是否需要被编译,取决于业务上的原因和是否需要实现额外的逻辑. 工作流标记和代码逻辑文件的使用方式类似于ASP.NET中将表现层文件与业务逻辑层文件分离.
基本结构
工作流标记的基本结构包括表示工作流类型的根节点和作为根节点子元素的工作流活动. 因为工作流标记基于XAML元素和属性的一个子集,所以它的结构和XAML文件很类似. 例如,工作流中的每个元素都被表示为节点,无论是复合活动还是工作流本身.
元素和属性
如上一节所述,工作流标记文件中的每个元素都有其相应的工作流组件. 这些元素的名称就是我们以编程的方式创建工作流时活动的名称. 例如,IfElseActivity 活动被表示为<IfElseActivity> 元素. 自定义活动也是如此.
活动成员的定义和显示:
<SampleActivity Property1="PropValue" Method="CustomMethod" Event="EventHandlerMethod"/>
XAML 也提供在工作流标记中插入自定义代码的特性:使用 x:Code 定义元素. 注意,代码必须插入到CDATA 节中. 如下面的例子:
<CodeActivity x:Name="codeActivity1" ExecuteCode="methodName1">
<x:Code><![CDATA[
void methodName1(object sender, EventArgs e)
{
}
]]></x:Code>
</CodeActivity>
提示 |
x:Code 元素只能在需要被编译的工作流标记文件中使用. |
下表描述了常用的工作流标记属性:
属性 |
描述 |
x:Array |
类型数组 |
x:Class |
工作流类的名称,包含名称空间,工作流类将使用这个名称被编译. |
x:Name |
活动的名称. 对应于 Activity.Name 属性. |
x:Type |
类型引用. |
x:Null |
空值. |
xmlns:x |
XAML架构的名称空间. |
xmlns |
XAML架构的名称空间. |
示例
下例展示了采用代码分离方式创建的工作流中的标记文件.
<SequentialWorkflowActivity x:Class="XAMLWorkflow.Workflow1" x:Name="Workflow1" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/workflow">
<IfElseActivity x:Name="ifElseActivity1">
<IfElseBranchActivity x:Name="ifElseBranchActivity1">
<IfElseBranchActivity.Condition>
<CodeCondition Condition="EvalCondition" />
</IfElseBranchActivity.Condition>
<CodeActivity x:Name="codeActivity1" ExecuteCode="codeActivity1_ExecuteCode" />
<FaultHandlersActivity x:Name="faultHandlersActivity1">
<FaultHandlerActivity x:Name="faultHandlerActivity1" Fault="{ActivityBind Workflow1,Path=faultHandlerProp}" FaultType="{x:Type System.NullReferenceException}">
<CodeActivity x:Name="codeActivity3" ExecuteCode="codeActivity3_ExecuteCode" />
</FaultHandlerActivity>
</FaultHandlersActivity>
</IfElseBranchActivity>
<IfElseBranchActivity x:Name="ifElseBranchActivity2">
<CodeActivity x:Name="codeActivity2" ExecuteCode="codeActivity2_ExecuteCode" />
</IfElseBranchActivity>
</IfElseActivity>
</SequentialWorkflowActivity>
提示 |
如果您采用非编译且只有XAML工作流标记文件的方式来创建工作流,您必须使用ActivityBind 标记扩展来设置类型事件处理器的所有依赖项属性,否则它们将无法在运行时被调用,请看下面的例子: |
<CodeActivity x:Name="codeActivity1" ExecuteCode="{ActivityBind Name=Activity12, Path=codeActivity1_ExecuteCode}" />
提示 |
如果您采用非编译且只有XAML工作流标记文件的方式来创建工作流, XAML文件中不应该出现x:Class 属性, 这个属性只有在工作流被编译时才有效. |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述