Sharping's Technique Claver

Just be a low-level developer !

博客园 首页 新随笔 联系 订阅 管理
  13 Posts :: 0 Stories :: 96 Comments :: 0 Trackbacks

    种种原因,好久没在这里写东西了,最近有点闲暇,打算写点工作流的东东,想来想去还是从工作流设计器说起,为用户提供一个轻量级设计器来定制工作流相信是任何与工作流相关的软件开发所必须做到的,后面的文章会一步步阐述如何使用实现它.OK,先看效果图片:

    我认为有必要对图中的设计器做些说明,我已经在上图中圈出来了:
    1.我们的设计器是面向最终用户,而不是开发者,所以设计器标题中的顺序工作流之类的字眼我们要解决
    2.活动的名称必须可以定义为我们需要的文字,而不是E文的类名,后面的codeActivity1就是未处理的效果
    3.我们的工具箱中同样要显示活动中文名称
    4.我们提供一个属性窗体显示活动信息,当然这个是可选的
    5.当按钮点击工作流开始箭头图标时候必须屏蔽掉 View SequentialWorkflow, View Cancel Handler和View Fault Handlers这三个菜单
    6.提供一个上下文菜单在设计器中进行一般操作

    本文先从如何宿主设计器说起,然后一步步完成上述的功能。我们先要了解一些会用到的工作流设计器相关的类:
    WorkflowDesignerLoader: 负责从工作流的导入导出,直白点说就是完成工作流的序列化和反序列化。
    WorkflowDesignerView: 负责在UI上呈现工作流。
    DesignSurface: 负责从宿主中加载工作流设计器,完成WorkflowDesignerView的构建。
    这里我只对这些类功能简单介绍,更详细的资料可以参考MSDN。
    
    首先,我们需要改变VS中设计器加载工作流的一些行为,我们要做的很简单,就是从一个XOML文件读取一个工作流和把一个设计好的工作流导出到一个XOML文件。上面已经说过WorkflowDesignerLoader负责这个工作,当然,忧郁VS设计器具有更复杂的功能,那么我们将对WorkflowDesignerLoader做一些控制,让它只完成我们需要的操作。
    我们定义一个WorkflowLoader类,让他继承自WorkflowDesignerLoader类,而在WorkflowDesignerLoader类中,加载工作流的动作是由方PerformLoad完成的,我们可以重写这个方法,加入我们自己的逻辑来完成对工作流的加载,首先我们在WorkflowLoader类中定义一个属性来保存XOML文件路径:
   

public string Xoml{get;set;}

    然后重写方法:

protected override void PerformLoad(IDesignerSerializationManager serializationManager)
        {
            
base.PerformLoad(serializationManager);
            IDesignerHost designerHost 
= (IDesignerHost)GetService(typeof(IDesignerHost));

                reader 
= new XmlTextReader(this.Xoml);
                Activity rootActivity 
= null;
            
try
            {
                WorkflowMarkupSerializer xomlSerializer 
= new WorkflowMarkupSerializer();
                rootActivity 
= xomlSerializer.Deserialize(reader) as Activity;
            }
            
finally
            {
                reader.Close();
            }

            
if (rootActivity != null && designerHost != null)
            {
//构造设计器中的活动树
                AddObjectGraphToDesignerHost(designerHost, rootActivity);
                Type companionType 
= rootActivity.GetValue(WorkflowMarkupSerializer.XClassProperty) as Type;
                
if (companionType != null)
{
                    SetBaseComponentClassName(companionType.FullName);
}
            }

            designerHost.Activate();
            
// 如果存在规则定义,从规则定义文件中读取规则信息
            string rulesFile = Path.Combine(Path.GetDirectoryName(this.Xoml), Path.GetFileNameWithoutExtension(this.Xoml) + ".rules");
            
if (File.Exists(rulesFile))
            {
                StreamReader rulesReader 
= new StreamReader(rulesFile, Encoding.UTF8);
                
this.tempRulesStream = new StringBuilder(rulesReader.ReadToEnd());
                rulesReader.Close();
            }

        }

    代码中有一个AddObjectGraphToDesignerHost方法用来创建活动树的逻辑结构:

AddObjectGraphToDesignerHost

 

    而上面的方法中用到一个方法递归构造一个活动的子活动:

GetNestedActivities

    对于工作流的导出我们重写PerformFlush方法实现:

PerformFlush

     PerformFlush方法是protected的,可以通过public的Flush方法公开出去,因此我们还要重写一下Flush方法:

public override void Flush()
        {
            PerformFlush(
null);
        }

    到次,一个WorkflowDesignerLoader的主要功能就完成了,后面的文章我会继续讲述完成宿主设计器到应用程序的其他工作。
   

posted on 2007-12-27 16:07 sharping 阅读(752) 评论(11)  编辑 收藏 网摘 所属分类: Workflow Foundation

Feedback

楼主写的太好了~~
希望楼主继续努力 写出更多更好的文章~~
  回复  引用    

#2楼  2008-01-19 19:33 Haodaohong [未注册用户]
不错,最近在思考窗体表单设计器方面的东西,学习了!
  回复  引用    

#3楼  2008-01-22 08:57 巫云      
这个东西能在webform上实现吗?
  回复  引用  查看    

#4楼 [楼主] 2008-01-22 09:01 sharping      
@巫云

在网上有一个老外写的Web版实现,记不清在哪里了,我想用WebPart应该可以实现吧

  回复  引用  查看    

#5楼  2008-01-22 11:25 游勇 [未注册用户]
學習了...
  回复  引用    

#6楼  2008-01-22 18:20 webqsoft [未注册用户]
you can implement workflow design by vml on web page
  回复  引用    

#7楼  2008-04-03 13:46 feishu [未注册用户]
这个流程设计器那里有的下载呀!
QQ:78815730
  回复  引用    

#8楼  2008-04-22 11:25 JOC [未注册用户]
現正在WF研究中,希望能與樓主流
QQ:4401646
  回复  引用    

楼主有这个例子的代码吗?能发下吗?我现在毕业设计老师非让开发一个这个,正愁那?希望楼主能不吝赐教!qq:284941249
  回复  引用    

#10楼  2008-11-21 13:34 孙淮涟      
怎么不把代码包贴上来
  回复  引用  查看    

#11楼  2008-11-28 16:59 &JIAN      
看楼主这界面,我想问个问题,WorkflowMarkupSerializer的Deserialize不支持中文反序列化,我该怎么办?
希望楼主赐教!发我邮箱里面吧
thjian@live.cn
谢谢!
  回复  引用  查看    


标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2007-12-27 16:14 编辑过
Google站内搜索

China-pub 计算机图书网上专卖店!6.5万品种 2-8折!
近千种 9-95 新二手计算图书火热销售中!
开发者征途系统新作:《设计模式——基于C#的工程化实现及扩展》



相关文章:

相关链接: