Windows Workflow Foundation(四)——(创建自定义活动)(转载)

简介:

WWF包含了一组丰富的通用用户活动,这些能满足绝大多数的场景的需求。但有时,我们还是会碰到需要一些更加自定义的活动的场景。WWF SDK拥有一些可扩展的特性,能使你轻松的创建自定义的活动,并把他们应用到你的解决方案中。在这一节中,我们会编写一个自定义活动,用来根据传入工作流的参数,从网页中下载文本。

创建一个网页解析自定义活动

这个自定义活动会根据传入活动的网页属性集,从网页中下载文本。页面一旦下载完毕,活动就会发出一个网页下载完毕的事件,并把网页数据值发回工作流。

创建WebTearActivity

WebTear类继承自System.Workflow.ComponentModel.Activity。当你定义了一个自定义活动时,把ToolboxItemAttributes属性应用到类上,并指明为ActivityboxItem类型。以下的代码就是一个最小的自定义活动。

using System;
using
System.ComponentModel;
using
System.Workflow.ComponentModel;
using
System.Workflow.ComponentModel.Design;
using
System.Workflow.ComponentModel.Compiler;

namespace
Microsoft.Samples.Workflow.Quickstarts.CustomActivity
{
[ToolboxItemAttribute(typeof
(ActivityToolboxItem))]
public class
WebTear : System.Workflow.ComponentModel.Activity
{
}

}


定义活动属性

自定义活动属性的定义和WinForm控件属性的定义类似。当你定义一个自定义活动的属性时,使用DependencyProperty来存储属性的属性。这能让各种不同类型的属性都能一致地有效地工作。在实际定义属性时,你可能还会用到DependencyProperty中的方法,所以,不要把这个字段定义成private

活动中的一个属性可以应用许多不同的特性。这些特性通常都是用来支持WWF设计器的工作的。我们的这个属性应用了一下的特性:

1. CategoryAttribute:在设计器的属性窗口中,这个属性位于那个分类下。

2. DescriptionAttribute:设计器属性窗口中显示的属性描述。

3. BrowsableAttribute:这是一个布尔值,指示了是否在属性窗口中显示这个属性。

4. ValidationVisibilityAttribute:指定了如何验证属性的值。验证选项包括:可选Optional、必需Required、隐藏Hidden

5. DesignerSerializationVisibilityAttribute:指定了是否和如何序列化这个属性。选项包括:可见Visible、隐藏Hidden、内容Content

以下的代码示例了如何定义WebPage属性。

public static DependencyProperty WebPageProperty =
DependencyProperty.Register( "WebPage", typeof(System.String), typeof (Microsoft.Samples.Workflow.Quickstarts.CustomActivity.WebTear ) );

[DesignerSerializationVisibilityAttribute(DesignerSerializationVisibility.Visible)]
[ValidationVisibilityAttribute(ValidationVisibility.Optional)]
[BrowsableAttribute(true
)]
[DescriptionAttribute("Web page to download"
)]
[CategoryAttribute("WebTear Property"
)]
public string
WebPage
{
get

{
return ((string)(base
.GetValue(Microsoft.Samples.Workflow.Quickstarts.CustomActivity.WebTear.WebPageProperty)));
}

set
{
base
.SetValue(Microsoft.Samples.Workflow.Quickstarts.CustomActivity.WebTear.WebPageProperty, value);
}

}


重载Execute方法

当你创建了一个自定义活动,运行时,工作流引擎会调用活动的Execute方法来执行活动实际的操作。这个方法是在基类中定义的,但你可以重载这个方法,以适应你的活动的功能。

WebTear活动会在Execute方法中下载请求的网页,并在下载完成后引发一个事件,将页面数据发回工作流。我们需要定义一个PageFinishedEventArgs类用于事件参数,这个类中有一个Data字段用来存放网页数据。这些数据会在之后被工作流中的事件处理函数访问到。一旦数据下载完毕,Execute方法返回一个Status.Closed枚举值,来通知工作流引擎活动已经完成执行了。

一下的代码演示了如何定义PageFinishedEventArgs

public class PageFinishedEventArgs
{
private string
data;

public PageFinishedEventArgs( string
data )
{
this.data =
data;
}


public string Data
{
get { return data; }

}
}


以下的代码演示了如何实现Execute方法。

public delegate void PageFinishedEventHandler( object sender, PageFinishedEventArgs e );
public event
PageFinishedEventHandler PageFinished;

protected override
Status Execute(ActivityExecutionContext context)
{
System.Net.WebClient client = new
System.Net.WebClient();
string
pageData;

try

{
// Download the web page data

pageData = client.DownloadString(WebPage);
}

catch (Exception e)
{
pageData =
e.Message;
}


// Raise the PageFinished event back to the host
PageFinished(null, new PageFinishedEventArgs(pageData));

// Notifiy the runtime that the activity has finished

return Status.Closed;
}


WebTear活动创建顺序工作流

此时,我们已经创建好了下载网页的自定义活动。现在我们创建一个简单的顺序工作流,来测试一下这个自定义活动的功能。

这个工作流只包含一个活动,就是我们的WebTear活动。要下载的网页地址被传到工作流的Parameters集合中,这个的值用来设置活动的WebPage属性。最后,当活动结束下载后,触发事件,工作流会从事件参数中提取网页数据,并把数据通过Parameters集合中的out参数发回宿主程序。以下代码演示了顺序工作流的实现

using System;
using
System.ComponentModel;
using
System.Workflow.ComponentModel;
using
System.Workflow.ComponentModel.Design;
using
System.Workflow.ComponentModel.Compiler;
using
System.Workflow.Activities;

namespace
Microsoft.Samples.Workflow.Quickstarts.CustomActivity
{
public sealed partial class
WebTearActivityWorkflow : SequentialWorkflow
{
private string
webSite;
private
WebTear webTear1;

public
WebTearActivityWorkflow()
{
InitializeComponent();
}


private void InitializeComponent()
{
System.Workflow.ComponentModel.ActivityBind activitybind1 = new
System.Workflow.ComponentModel.ActivityBind();
System.Workflow.ComponentModel.ParameterDeclaration WebPage = new
System.Workflow.ComponentModel.ParameterDeclaration();
System.Workflow.ComponentModel.ParameterDeclaration PageData = new
System.Workflow.ComponentModel.ParameterDeclaration();
this.webTear1 = new
Microsoft.Samples.Workflow.Quickstarts.CustomActivity.WebTear();
//

//
webTear1
//

this.webTear1.ID = "webTear1" ;
activitybind1.ID = "/Workflow"
;
activitybind1.Path = "webSite"
;
this.webTear1.PageFinished += new Microsoft.Samples.Workflow.Quickstarts.CustomActivity.WebTear.PageFinishedEventHandler(this
.webTear1_PageFinished);
this
.webTear1.SetBinding(Microsoft.Samples.Workflow.Quickstarts.CustomActivity.WebTear.WebPageProperty, ((System.Workflow.ComponentModel.Bind)(activitybind1)));
//

//
WebTearActivityWorkflow
//

this.Activities.Add(this .webTear1);
this.DynamicUpdateCondition = null
;
this.ID = "WebTearActivityWorkflow"
;
WebPage.Direction =
System.Workflow.ComponentModel.ParameterDirection.In;
WebPage.Name = "WebPage"
;
WebPage.Type = typeof
(System.String);
WebPage.Value = null
;
PageData.Direction =
System.Workflow.ComponentModel.ParameterDirection.Out;
PageData.Name = "PageData"
;
PageData.Type = typeof
(System.String);
PageData.Value = null
;
this
.Parameters.Add(WebPage);
this
.Parameters.Add(PageData);
this.Initialized += new System.EventHandler(this
.InitVars);

}


private void InitVars(object sender, EventArgs e)
{
webSite = this.Parameters["WebPage"
].Value.ToString();
}


private void webTear1_PageFinished(object sender, PageFinishedEventArgs e)
{
this.Parameters["PageData"].Value =
e.Data;
}

}
}


创建宿主程序

这里的宿主程序是一个Winform程序,它有一个TextBox来输入要下载的url,当点击Go按钮,工作流开始运行,并执行WebTear活动开始下载网页。工作流运行完后,宿主程序从WorkflowCompleteEventArgs对象中获得网页数据,并把它显示在另一个TextBox中。以下代码演示了如何实现宿主程序(译者注:私自去掉了不重要的代码,要看完整的自个儿去msdn上找,呵呵)。

……

namespace
Microsoft.Samples.Workflow.Quickstarts.CustomActivity
{
public class
MainForm : Form
{
private
System.Windows.Forms.Label addressCaption;
private
System.Windows.Forms.TextBox address;
private
System.Windows.Forms.TextBox data;
private
System.Windows.Forms.Button goButton;

private
WorkflowRuntime workflowRuntime;

public
MainForm()
{
InitializeComponent();

workflowRuntime = new
WorkflowRuntime();
workflowRuntime.StartRuntime();

workflowRuntime.WorkflowCompleted += new EventHandler<WorkflowCompletedEventArgs>
(workflowRuntime_WorkflowCompleted);
}


void workflowRuntime_WorkflowCompleted(object sender, WorkflowCompletedEventArgs e)
{
// Retrieve the downloaded page data

if (data.InvokeRequired)
data.Invoke(new EventHandler<WorkflowCompletedEventArgs>
(workflowRuntime_WorkflowCompleted), sender, e);
else

data.Text = e.OutputParameters["PageData" ].ToString();
}


private void goButton_Click(object sender, EventArgs e)
{
Type type = typeof
(Microsoft.Samples.Workflow.Quickstarts.CustomActivity.WebTearActivityWorkflow);

//
Sending the data to the workflow.
// First create the required property set

Dictionary<string, object> properties = new Dictionary<string, object> ();
properties.Add("WebPage"
, address.Text);
properties.Add("PageData", ""
);

workflowRuntime.StartWorkflow(type, properties);
}


……
}

}



本文转自高海东博客园博客,原文链接:http://www.cnblogs.com/ghd258/archive/2005/12/31/309165.html,如需转载请自行联系原作者
相关文章
|
2月前
|
Windows
.NET 隐藏/自定义windows系统光标
【10月更文挑战第20天】在.NET中,可以使用`Cursor`类来控制光标。要隐藏光标,可将光标设置为`Cursors.None`。此外,还可以通过从文件或资源加载自定义光标来更改光标的样式。例如,在表单加载时设置`this.Cursor = Cursors.None`隐藏光标,或使用`Cursor.FromFile`方法加载自定义光标文件,也可以将光标文件添加到项目资源中并通过资源管理器加载。这些方法适用于整个表单或特定控件。
|
4月前
|
Java 应用服务中间件 Windows
【App Service for Windows】为 App Service 配置自定义 Tomcat 环境
【App Service for Windows】为 App Service 配置自定义 Tomcat 环境
|
4月前
|
PHP 开发工具 git
【Azure 应用服务】在 App Service for Windows 中自定义 PHP 版本的方法
【Azure 应用服务】在 App Service for Windows 中自定义 PHP 版本的方法
|
4月前
|
vr&ar C# 图形学
WPF与AR/VR的激情碰撞:解锁Windows Presentation Foundation应用新维度,探索增强现实与虚拟现实技术在现代UI设计中的无限可能与实战应用详解
【8月更文挑战第31天】增强现实(AR)与虚拟现实(VR)技术正迅速改变生活和工作方式,在游戏、教育及工业等领域展现出广泛应用前景。本文探讨如何在Windows Presentation Foundation(WPF)环境中实现AR/VR功能,通过具体示例代码展示整合过程。尽管WPF本身不直接支持AR/VR,但借助第三方库如Unity、Vuforia或OpenVR,可实现沉浸式体验。例如,通过Unity和Vuforia在WPF中创建AR应用,或利用OpenVR在WPF中集成VR功能,从而提升用户体验并拓展应用功能边界。
73 0
|
4月前
|
开发者 C# Windows
WPF与游戏开发:当桌面应用遇见游戏梦想——利用Windows Presentation Foundation打造属于你的2D游戏世界,从环境搭建到代码实践全面解析新兴开发路径
【8月更文挑战第31天】随着游戏开发技术的进步,WPF作为.NET Framework的一部分,凭借其图形渲染能力和灵活的UI设计,成为桌面游戏开发的新选择。本文通过技术综述和示例代码,介绍如何利用WPF进行游戏开发。首先确保安装最新版Visual Studio并创建WPF项目。接着,通过XAML设计游戏界面,并在C#中实现游戏逻辑,如玩家控制和障碍物碰撞检测。示例展示了创建基本2D游戏的过程,包括角色移动和碰撞处理。通过本文,WPF开发者可更好地理解并应用游戏开发技术,创造吸引人的桌面游戏。
189 0
|
4月前
|
C# Windows 开发者
当WPF遇见OpenGL:一场关于如何在Windows Presentation Foundation中融入高性能跨平台图形处理技术的精彩碰撞——详解集成步骤与实战代码示例
【8月更文挑战第31天】本文详细介绍了如何在Windows Presentation Foundation (WPF) 中集成OpenGL,以实现高性能的跨平台图形处理。通过具体示例代码,展示了使用SharpGL库在WPF应用中创建并渲染OpenGL图形的过程,包括开发环境搭建、OpenGL渲染窗口创建及控件集成等关键步骤,帮助开发者更好地理解和应用OpenGL技术。
264 0
|
4月前
|
存储 开发者 C#
WPF与邮件发送:教你如何在Windows Presentation Foundation应用中无缝集成电子邮件功能——从界面设计到代码实现,全面解析邮件发送的每一个细节密武器!
【8月更文挑战第31天】本文探讨了如何在Windows Presentation Foundation(WPF)应用中集成电子邮件发送功能,详细介绍了从创建WPF项目到设计用户界面的全过程,并通过具体示例代码展示了如何使用`System.Net.Mail`命名空间中的`SmtpClient`和`MailMessage`类来实现邮件发送逻辑。文章还强调了安全性和错误处理的重要性,提供了实用的异常捕获代码片段,旨在帮助WPF开发者更好地掌握邮件发送技术,提升应用程序的功能性与用户体验。
69 0
|
4月前
|
安全 Shell Windows
记windows自定义bat脚本自启动
【8月更文挑战第27天】在Windows系统中,可让自定义bat脚本自启动的方法有两种:一是利用“启动”文件夹,通过创建bat脚本的快捷方式并将其放置于该文件夹;二是使用任务计划程序,创建一个启动时触发的任务来运行bat脚本。需确保脚本正确安全,避免对系统产生不良影响。
215 0
|
4月前
|
Java 应用服务中间件 Windows
【Azure 应用服务】App Service for Windows 环境中为Tomcat自定义4xx/5xx页面
【Azure 应用服务】App Service for Windows 环境中为Tomcat自定义4xx/5xx页面
|
7月前
|
存储 安全 搜索推荐
Windows之隐藏特殊文件夹(自定义快捷桌面程序)
Windows之隐藏特殊文件夹(自定义快捷桌面程序)
109 1
下一篇
无影云桌面