第一部分
基础工作,建立代码结构框架
1.创建项目WorkflowDesignerControl
1.1:WorkflowView和DesignSurface,workflowView是微软提供的工作流设计API,所有的操作都要在上面进行;DesignSurface是WorkflowView的设计时支持
WorkflowView需要从中获得一些资源。
1.2:工具箱和属性窗口也要放到WorkflowDesignerControl中
 

自定义工作流设计器Toolbox toolbox = new Toolbox(this);
自定义工作流设计器  
this.propertyGridSplitter.Panel1.Controls.Add(toolbox);
自定义工作流设计器  toolbox.Dock 
= DockStyle.Fill;
自定义工作流设计器  toolbox.BackColor 
= BackColor;
自定义工作流设计器  toolbox.Font 
= WorkflowTheme.CurrentTheme.AmbientTheme.Font; 
自定义工作流设计器

2、在WorkflowDesignerControl加入ActivityLibrary的引用
  DesignerHostingApplication中加入ActivityLibrary和WorkflowDesignerControl的引用
  DesignerHostingApplication中加入System.Design,System.Drawing.Design,System.Workflow.Activities,System.Workflow.ComponentModel的引用

3.所有自定义的Activitie放入一个project,这样基本的代码架构就建立好了。

第二部分
winfrom中集成可编程的wf设计器
1.首先创建DesignerHostingApplication的解决方案
重命名from1.cs为DesignerShell.cs,并加入工具条
Toolstrip
 Name: toolStrip
 GripStyle: Hidden
 RenderMode: System
 Ensure the Dock property is set to Top
将WorkflowDesignControl加入toolStrip
 Name: workflowDesignerControl
 Dock: Fill
2.使设计器支持zooming
 

自定义工作流设计器public void ProcessZoom(int zoomFactor)

2.1:使用预定义的zoom levels 25%, 100% and 200%,zoom设计器in or out
 在DesignerShell.cs中调用ProcessZoom
 

自定义工作流设计器private void zoomDropDownMenuItem_Click(object sender, EventArgs e)

2.2:在toolstrip中加入dropdownButton并定义属性:
  Name: zoomDropDown
  DisplayStyle: Text
  Text: Zoom
  编辑DropDownButton,加入三个Item对应Text分别为:25% ,100%,200%
  每个item分别定义name和tag,分别为;mni25PercentZoom,25;mni100PercentZoom,100;mni200PercentZoom,200;
  并定义click事件
 
3如何在wf中添加Activities(能在workflow中添加或删除Activitie,并能修改activity的属性)
1.在WorkflowDesignerControl.cs中添加自定义的工具箱
 

自定义工作流设计器public WorkflowDesignerControl()


2.使WorkflowDesignerControl中的工具箱运行时加载Activitie(可以是自定义的)
 在ToolBoxItems.txt中注册
 例如我有个自定义的basic Activitie,如果要把这个Activiti加入工具箱中可以在ToolBoxItems.txt中这样写
   ActivityLibrary.MessageActivity, ActivityLibrary
 运行后就可以看到工具箱中有MessageActivity
3.在设计器中选择Activity并编辑属性
 在WorkflowDesignerControl.cs中注册事件SelectionChanged
 

自定义工作流设计器ISelectionService selectionService = GetService(typeof(ISelectionService)) as ISelectionService;
自定义工作流设计器
自定义工作流设计器                    
if (selectionService != null)

  实现OnSelectionChanged事件
 

自定义工作流设计器 private void OnSelectionChanged(object sender, EventArgs e)

 这样,当WorkflowDesignerControl运行时,在右边下角会显示会选择所选择Activity的属性
4.使工作流设计器支持删除功能
在WorkflowDesignerControl.cs中加入方法DeleteSelected,支持在设计器中删除Activity.

自定义工作流设计器public void DeleteSelected()

       
在界面工具条上添加Button,属性如下
  Name: btnDelete
 DisplayStyle: Text
 Text: “Remove Activity”
在click事件中写入对WorkflowDesignerControl中DeleteSelected方法的调用

自定义工作流设计器private void btnDelete_Click(object sender, EventArgs e)

5.使工作流设计器实现保存,编译,运行和打开已保存工作流的功能。
在工具条上再次添加按钮名称分别为打开,保存,编译和运行,在这些按钮的事件触发程序中调用workflowDesignerControl中已经定义好的方法
5.1在workflowDesignerControl中添加方法,加载已经存在的工作流模板文件
  

自定义工作流设计器 public void LoadExistingWorkflow()

5.2:保存功能实现
 

自定义工作流设计器private void SaveFile()

5.3:编译功能实现
 

自定义工作流设计器public bool Compile()


注意:
parameters.GenerateInMemory = true;这时assembly只在内存中生成,不输出到文件
如果要生成.dll文件,需要修改为
parameters.GenerateInMemory = false;
parameters.OutputAssembly = string.Format("{0}.dll", this.WorkflowName);
 
6:在工具条的事件中调用这些方法
测试一下
如果还没有保存,运行后会先保存并编译。

补传 本文所示代码:demo


     

相关文章: