1、创建Activity Library
2、更改Base Class 为System.Workflow.ComponentModel.Activity
3、插入代码段 Workflow->DependencyProperty Property,定义属性
4、重写Execute事件
protected
override
ActivityExecutionStatus Execute(ActivityExecutionContext executionContext)
... {
//Console.WriteLine(To);
MailAddress toAddress = new MailAddress(To);
MailAddress fromAddress = new MailAddress(From);
MailAddressCollection addresses = new MailAddressCollection();
addresses.Add(toAddress);
MailMessage msg = new MailMessage(fromAddress,toAddress);
msg.Subject = Subject;
msg.Body = Body;
SmtpClient mail = new SmtpClient("localhost");
mail.Send(msg);
return ActivityExecutionStatus.Closed;
}
... {
//Console.WriteLine(To);
MailAddress toAddress = new MailAddress(To);
MailAddress fromAddress = new MailAddress(From);
MailAddressCollection addresses = new MailAddressCollection();
addresses.Add(toAddress);
MailMessage msg = new MailMessage(fromAddress,toAddress);
msg.Subject = Subject;
msg.Body = Body;
SmtpClient mail = new SmtpClient("localhost");
mail.Send(msg);
return ActivityExecutionStatus.Closed;
}
5、添加代码文件(Code file),对先前定义的属性进行验证
using
System;
using System.Workflow.Activities;
using System.Workflow.ComponentModel;
using System.Workflow.ComponentModel.Compiler;
using System.Text.RegularExpressions;
using System.Net.Mail;
namespace SendMailActivityLibrary
... {
public class ParametersValidator : ActivityValidator
...{
public override ValidationErrorCollection ValidateProperties(ValidationManager manager, object obj)
...{
ValidationErrorCollection validationErrors = new ValidationErrorCollection(base.ValidateProperties(manager, obj));
SendMailActivity sendMailActivityToBeValidated = obj as SendMailActivity;
if (sendMailActivityToBeValidated == null)
...{
throw new InvalidOperationException("Parameter obj is not of type SendMailActivity");
}
if (!IsValidEmailAddress(sendMailActivityToBeValidated.To))
...{
ValidationError CustomActivityValidationError = new ValidationError(String.Format("'{0}' is an Invalid destination e-mail address", sendMailActivityToBeValidated.To), 1);
validationErrors.Add(CustomActivityValidationError);
}
if (!IsValidEmailAddress(sendMailActivityToBeValidated.From))
...{
ValidationError CustomActivityValidationError =
new ValidationError(String.Format("'{0}' is an Invalid source e-mail address", sendMailActivityToBeValidated.From), 1);
validationErrors.Add(CustomActivityValidationError);
}
return validationErrors;
//return base.ValidateProperties(manager, obj);
}
private bool IsValidEmailAddress(string address)
...{
//throw new Exception("The method or operation is not implemented.");
if (address == null || address.Length == 0)
...{
return true;
}
Regex rx = new Regex(@"[^A-Za-z0-9@-_.]", RegexOptions.Compiled);
MatchCollection matches = rx.Matches(address);
if (matches.Count > 0)
...{
return false;
}
int i = address.IndexOf('@');
if (i <= 0 || i > address.Length - 3)
...{
return false;
}
if (address.IndexOf('@', i + 1) >= 0)
...{
return false;
}
int j = address.LastIndexOf('.');
if (j >= 0 && j <= i + 1)
...{
return false;
}
return true;
}
}
}
using System.Workflow.Activities;
using System.Workflow.ComponentModel;
using System.Workflow.ComponentModel.Compiler;
using System.Text.RegularExpressions;
using System.Net.Mail;
namespace SendMailActivityLibrary
... {
public class ParametersValidator : ActivityValidator
...{
public override ValidationErrorCollection ValidateProperties(ValidationManager manager, object obj)
...{
ValidationErrorCollection validationErrors = new ValidationErrorCollection(base.ValidateProperties(manager, obj));
SendMailActivity sendMailActivityToBeValidated = obj as SendMailActivity;
if (sendMailActivityToBeValidated == null)
...{
throw new InvalidOperationException("Parameter obj is not of type SendMailActivity");
}
if (!IsValidEmailAddress(sendMailActivityToBeValidated.To))
...{
ValidationError CustomActivityValidationError = new ValidationError(String.Format("'{0}' is an Invalid destination e-mail address", sendMailActivityToBeValidated.To), 1);
validationErrors.Add(CustomActivityValidationError);
}
if (!IsValidEmailAddress(sendMailActivityToBeValidated.From))
...{
ValidationError CustomActivityValidationError =
new ValidationError(String.Format("'{0}' is an Invalid source e-mail address", sendMailActivityToBeValidated.From), 1);
validationErrors.Add(CustomActivityValidationError);
}
return validationErrors;
//return base.ValidateProperties(manager, obj);
}
private bool IsValidEmailAddress(string address)
...{
//throw new Exception("The method or operation is not implemented.");
if (address == null || address.Length == 0)
...{
return true;
}
Regex rx = new Regex(@"[^A-Za-z0-9@-_.]", RegexOptions.Compiled);
MatchCollection matches = rx.Matches(address);
if (matches.Count > 0)
...{
return false;
}
int i = address.IndexOf('@');
if (i <= 0 || i > address.Length - 3)
...{
return false;
}
if (address.IndexOf('@', i + 1) >= 0)
...{
return false;
}
int j = address.LastIndexOf('.');
if (j >= 0 && j <= i + 1)
...{
return false;
}
return true;
}
}
}
6、添加代码文件(Code file),进行界面设计
using
System;
using System.Text;
using System.ComponentModel;
using System.Collections;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Design;
using System.Workflow.ComponentModel.Compiler;
using System.Workflow.ComponentModel.Serialization;
using System.Workflow.ComponentModel;
using System.Workflow.ComponentModel.Design;
using System.Workflow.Runtime;
using System.Workflow.Activities;
using System.Workflow.Activities.Rules;
namespace SendMailActivityLibrary
... {
public class SendMailDesigner:ActivityDesigner
...{
SendMailActivity parentActivity;
protected override void Initialize(Activity activity)
...{
base.Initialize(activity);
parentActivity = (SendMailActivity)activity;
}
protected override Size OnLayoutSize(ActivityDesignerLayoutEventArgs e)
...{
return new Size(230, 100);
}
protected override void OnPaint(ActivityDesignerPaintEventArgs e)
...{
Rectangle frameRect = new Rectangle(this.Location.X, this.Location.Y, this.Size.Width - 5, this.Size.Height - 5);
Rectangle shadowRect = new Rectangle(frameRect.X + 5, frameRect.Y + 5, frameRect.Width, frameRect.Height);
Rectangle pageRect = new Rectangle(frameRect.X + 4, frameRect.Y + 24, frameRect.Width - 8, frameRect.Height - 28);
Rectangle titleRect = new Rectangle(frameRect.X + 15, frameRect.Y + 4, frameRect.Width / 2, 20);
Brush frameBrush =new LinearGradientBrush(frameRect,Color.DarkBlue,Color.LightBlue,45);
e.Graphics.FillPath(Brushes.LightGray,RoundedRect(shadowRect));
e.Graphics.FillPath(frameBrush,RoundedRect(frameRect));
e.Graphics.FillPath(new LinearGradientBrush(pageRect,Color.White,Color.WhiteSmoke,45),RoundedRect(pageRect));
e.Graphics.DrawString(Activity.QualifiedName,new Font("Segoe UI",9),Brushes.White,titleRect);
frameRect.Inflate(20,20);
string textToDisplay=String.Format("To : '{0}' From : '{1}' Subject : '{2}' ",parentActivity.To,parentActivity.From,parentActivity.Subject);
e.Graphics.DrawString(String.Format(textToDisplay,parentActivity.Subject),new Font("宋体",8),Brushes.Black,pageRect.X,pageRect.Y+15);
}
private GraphicsPath RoundedRect(Rectangle frame)
...{
GraphicsPath path=new GraphicsPath();
int radius=7;
int diameter=radius*2;
Rectangle arc=new Rectangle(frame.Left,frame.Top,diameter,diameter);
path.AddArc(arc,180,90);
arc.X=frame.Right-diameter;
path.AddArc(arc,270,90);
arc.Y=frame.Bottom-diameter;
path.AddArc(arc,0,90);
arc.X=frame.Left;
path.AddArc(arc,90,90);
path.CloseFigure();
return path;
}
}
}
using System.Text;
using System.ComponentModel;
using System.Collections;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Design;
using System.Workflow.ComponentModel.Compiler;
using System.Workflow.ComponentModel.Serialization;
using System.Workflow.ComponentModel;
using System.Workflow.ComponentModel.Design;
using System.Workflow.Runtime;
using System.Workflow.Activities;
using System.Workflow.Activities.Rules;
namespace SendMailActivityLibrary
... {
public class SendMailDesigner:ActivityDesigner
...{
SendMailActivity parentActivity;
protected override void Initialize(Activity activity)
...{
base.Initialize(activity);
parentActivity = (SendMailActivity)activity;
}
protected override Size OnLayoutSize(ActivityDesignerLayoutEventArgs e)
...{
return new Size(230, 100);
}
protected override void OnPaint(ActivityDesignerPaintEventArgs e)
...{
Rectangle frameRect = new Rectangle(this.Location.X, this.Location.Y, this.Size.Width - 5, this.Size.Height - 5);
Rectangle shadowRect = new Rectangle(frameRect.X + 5, frameRect.Y + 5, frameRect.Width, frameRect.Height);
Rectangle pageRect = new Rectangle(frameRect.X + 4, frameRect.Y + 24, frameRect.Width - 8, frameRect.Height - 28);
Rectangle titleRect = new Rectangle(frameRect.X + 15, frameRect.Y + 4, frameRect.Width / 2, 20);
Brush frameBrush =new LinearGradientBrush(frameRect,Color.DarkBlue,Color.LightBlue,45);
e.Graphics.FillPath(Brushes.LightGray,RoundedRect(shadowRect));
e.Graphics.FillPath(frameBrush,RoundedRect(frameRect));
e.Graphics.FillPath(new LinearGradientBrush(pageRect,Color.White,Color.WhiteSmoke,45),RoundedRect(pageRect));
e.Graphics.DrawString(Activity.QualifiedName,new Font("Segoe UI",9),Brushes.White,titleRect);
frameRect.Inflate(20,20);
string textToDisplay=String.Format("To : '{0}' From : '{1}' Subject : '{2}' ",parentActivity.To,parentActivity.From,parentActivity.Subject);
e.Graphics.DrawString(String.Format(textToDisplay,parentActivity.Subject),new Font("宋体",8),Brushes.Black,pageRect.X,pageRect.Y+15);
}
private GraphicsPath RoundedRect(Rectangle frame)
...{
GraphicsPath path=new GraphicsPath();
int radius=7;
int diameter=radius*2;
Rectangle arc=new Rectangle(frame.Left,frame.Top,diameter,diameter);
path.AddArc(arc,180,90);
arc.X=frame.Right-diameter;
path.AddArc(arc,270,90);
arc.Y=frame.Bottom-diameter;
path.AddArc(arc,0,90);
arc.X=frame.Left;
path.AddArc(arc,90,90);
path.CloseFigure();
return path;
}
}
}
7、添加验证和界面支持
[Designer(typeof(SendMailDesigner),typeof(IDesigner))]
[ActivityValidator(typeof(ParametersValidator))]