上一篇:宿主工作流设计器(一)
        接着上一篇文章说,前面已经定义了一个WorkflowLoader类来完成工作流的导入与导出,下面我们接着完成工作流设计器的工作。
        本章我们主要讲述使用WorkflowView这个类在UI上呈现出一个工作流设计器。
        首先我们创建DesignSurface的一个实例:
 DesignSurface designSurface = new DesignSurface();
DesignSurface designSurface = new DesignSurface();前面已经讲过这个类是负责完成UI呈现工作的,这个类起到一个服务容器的作用,采用了微软经典的Service/Component模型,里面装载UI呈现设计器所需的各种服务,我们可以从其中取得一个设计器宿主对象,它是一个IDesignerHost接口,然后从这个宿主中获取到宿主在其中的工作流设计器,关于设计器设计器宿主结构可以参看MSDN。
 WorkflowLoader loader = new WorkflowLoader();
            WorkflowLoader loader = new WorkflowLoader(); loader.Xoml = xomlFile;
            loader.Xoml = xomlFile; designSurface.BeginLoad(loader);
            designSurface.BeginLoad(loader);
 IDesignerHost designerHost = designSurface.GetService(typeof(IDesignerHost)) as IDesignerHost;
            IDesignerHost designerHost = designSurface.GetService(typeof(IDesignerHost)) as IDesignerHost;
 IRootDesigner rootDesigner = designerHost.GetDesigner(designerHost.RootComponent) as IRootDesigner;
            IRootDesigner rootDesigner = designerHost.GetDesigner(designerHost.RootComponent) as IRootDesigner;前面文章说过,我们的设计器是面向客户的,而VS中的设计器顶部标题是“顺序工作流”,“状态机工作流“之类的专业字眼,因此我们必须让它变成我们定义的文字,刚开始我一直觉得这个标题应该是存在于WorkflowView的Title之类的属性中,然而仔细研究后发现问题并不是这么简单,微软的设计比我想象的要灵活得多,先汗一个!
设计器标题并不由设计器对象所决定,而是由载入到WorkflowView中的WorkFlow决定,Framework中所有的Activity对象都可以应用DesignerAttribute特性(SequentialWorkflowActivity也是继承了Activity),我们都知道Control类也可以用这个特性影响控件的设计时外观,而WorkFlow设计器也这样做了,我们可以定义个设计类来定制WorkFlow的设计时外观,我们看看一个DesignerAttribute构造函数的定义:
 public DesignerAttribute(Type designerType, Type designerBaseType);
public DesignerAttribute(Type designerType, Type designerBaseType); public class CustomSequentialWorkflowDesigner : SequentialWorkflowRootDesigner
public class CustomSequentialWorkflowDesigner : SequentialWorkflowRootDesigner {
    { private string m_text = null;
        private string m_text = null;
 protected override SequentialWorkflowHeaderFooter Header
        protected override SequentialWorkflowHeaderFooter Header {
        { get
            get {
            { base.Header.Text = "我的工作流";
                base.Header.Text = "我的工作流"; 
     return base.Header;
                return base.Header; }
            } }
        }

 protected override void Initialize(System.Workflow.ComponentModel.Activity activity)
        protected override void Initialize(System.Workflow.ComponentModel.Activity activity) {
        { 
             this.HelpText = "从工具箱中拖放活动到此处";
            this.HelpText = "从工具箱中拖放活动到此处"; }
        } 
 protected override bool ShowSmartTag
        protected override bool ShowSmartTag {
        { get
            get {
            { return false;
                return false; }
            } }
        } }
    }读到这里相信大家已经托管出一个属于自己的工作流设计器了,后面我们接着说说工具箱的定义和其他一些相关内容。
 
                    
                     
                    
                 
                    
                 
 
         
    
 
         
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号