Here's a small sample on how to add a new Verb and another SmartTag option to your custom Activity in the Windows Workflow Designer. Adding a new context-menu option to your activity is fairly easy and intuitive: You just need to create a new instance of the ActivityDesignerVerb class when your custom ActivityDesigner-derived class in initialized and add it to the Verbs collection.
Adding a new SmartTag option is a little bit more work. SmartTag options are also ActivityDesignerVerb instances; however, configured SmartTags are returned by the SmartTagVerb property as a readonly collection. To add a new one, you need to override this property and return you own collection instead.
Here's a small code sample that adds a single new "Save Image" Verb to right-click menu as well as adding a SmartTag for it:
public class CodeFirstSequentialActivityDesigner : SequenceDesigner
{
// ...
private List _smartTagVerbs =
new List();
/// <summary>
/// Overide the SmartTagVerbs collection to return our own
/// summary>
protected override ReadOnlyCollection SmartTagVerbs
{
get { return _smartTagVerbs.AsReadOnly(); }
}
/// <summary>
/// Override the Initialize method to add
/// our custom verbs
/// summary>
/// <param name="activity">Activity to associate with this
/// designer instanceparam>
protected override void Initialize(Activity activity)
{
base.Initialize(activity);
// get parent verbs and add them before our own custom verbs
_smartTagVerbs.AddRange(base.SmartTagVerbs);
ActivityDesignerVerb saveImageVerb = new ActivityDesignerVerb(
this, DesignerVerbGroup.Misc,
"Save Image", OnSaveImageVerbSelected
);
saveImageVerb.Enabled = true;
saveImageVerb.Supported = true;
// add an image
Guid imageProp = new Guid("B4C2B905-A6D3-4CD6-A91A-5005A02B9676");
saveImageVerb.Properties[imageProp] =
Properties.Resources.Resource_Bitmap.ToBitmap();
// add verb to both verb collections
_smartTagVerbs.Add(saveImageVerb);
Verbs.Add(saveImageVerb);
}
private void OnSaveImageVerbSelected(object sender, EventArgs e)
{
string name = Activity.Name;
Bitmap emptyImage = new Bitmap(Size.Width, Size.Height,
PixelFormat.Format32bppArgb);
using ( Graphics graphics = Graphics.FromImage(emptyImage) )
{
Image ourReflection = this.GetPreviewImage(graphics);
using ( SaveFileDialog dlg = new SaveFileDialog() )
{
dlg.Filter = "Image File (*.png)|*.png";
DialogResult res = dlg.ShowDialog();
if ( res == DialogResult.OK )
{
ourReflection.Save(dlg.FileName, ImageFormat.Png);
}
}
}
}
}
Technorati: WF, Windows Workflow Foundation, ActivityDesigner