宿主工作流程設計工具(二)

來源:互聯網
上載者:User

        上一篇:宿主工作流程設計工具(一)

        接著上一篇文章說,前面已經定義了一個WorkflowLoader類來完成工作流程的匯入與匯出,下面我們接著完成工作流程設計工具的工作。
        本章我們主要講述使用WorkflowView這個類在UI上呈現出一個工作流程設計工具。
        首先我們建立DesignSurface的一個執行個體:

DesignSurface designSurface = new DesignSurface();

       前面已經講過這個類是負責完成UI呈現工作的,這個類起到一個服務容器的作用,採用了微軟經典的Service/Component模型,裡面裝載UI呈現設計器所需的各種服務,我們可以從其中取得一個設計器宿主對象,它是一個IDesignerHost介面,然後從這個宿主中擷取到宿主在其中的工作流程設計工具,關於設計器設計器宿主結構可以參看MSDN。            WorkflowLoader loader = new WorkflowLoader();
            loader.Xoml = xomlFile;
            designSurface.BeginLoad(loader);

            IDesignerHost designerHost = designSurface.GetService(typeof(IDesignerHost)) as IDesignerHost;

            IRootDesigner rootDesigner = designerHost.GetDesigner(designerHost.RootComponent) as IRootDesigner;

      IRootDesigner介面為我們提供了一個GetView方法,通過調用該方法我們就得到了一個WorkFlowView對象,而這個對象是一個Control,我們把這個Control放到我們程式的UI中,這樣,一個工作流程設計工具就被我們宿主出來了,而當前工作流程設計工具所呈現的工作流程就是上面代碼中xomlFile(一個String類型變數,儲存一個工作流程檔案路徑)所定義的工作流程。前面一篇文章已經講述了WorkflowLoader類如何匯入匯出這個Xoml檔案,這裡就不再熬述。
      前面文章說過,我們的設計器是面向客戶的,而VS中的設計器頂部標題是“順序工作流程”,“狀態機器工作流程“之類的專業字眼,因此我們必須讓它變成我們定義的文字,剛開始我一直覺得這個標題應該是存在於WorkflowView的Title之類的屬性中,然而仔細研究後發現問題並不是這麼簡單,微軟的設計比我想象的要靈活得多,先汗一個!
      設計器標題並不由設計器對象所決定,而是由載入到WorkflowView中的WorkFlow決定,Framework中所有的Activity對象都可以應用DesignerAttribute特性(SequentialWorkflowActivity也是繼承了Activity),我們都知道Control類也可以用這個特性影響控制項的設計時外觀,而WorkFlow設計器也這樣做了,我們可以定義個設計類來定製WorkFlow的設計時外觀,我們看看一個DesignerAttribute建構函式的定義:public DesignerAttribute(Type designerType, Type designerBaseType);

      第一個參數是設計類的類型,第二個函數的設計類的基底類型。通過MSDN可以知道,工作流程對象的設計時基類是IRootDesigner,而對於工作流程我們可以用繼承自SequentialWorkflowRootDesigner的類來構造我們的設計類,而對於活動我們可以繼承自ActivityDesigner。當然SequentialWorkflowRootDesigner也繼承自ActivityDesigner,之所以用SequentialWorkflowRootDesigner是為了讓我們針對工作流程獲得更多的可定義項。我們繼承SequentialWorkflowRootDesigner後重寫Header屬性就可以改變工作流程設計工具標題,ActivityDesigner類中還有很多屬性可以讓我們自訂設計時外觀,例如我們想在可以拖入工作流程的地方寫上協助提示可以重寫HelpText屬性,相應的,我們前面提到我們希望當按鈕點擊工作流程開始箭頭表徵圖時候必須屏蔽掉 View SequentialWorkflow, View Cancel Handler和View Fault Handlers這三個菜單,我們可以重寫ShowSmartTag屬性,讓它總是返回false就可以做到,我們還可以重寫Initialize方法在活動載入時執行一些操作或定製一些行為。下面是一個設計類樣本:
     

public class CustomSequentialWorkflowDesigner : SequentialWorkflowRootDesigner
    {
        private string m_text = null;

        protected override SequentialWorkflowHeaderFooter Header
        {
            get
            {
                base.Header.Text = "我的工作流程";
    
                return base.Header;
            }
        }


        protected override void Initialize(System.Workflow.ComponentModel.Activity activity)
        {
            
            this.HelpText = "從工具箱中拖放活動到此處";
        } 

        protected override bool ShowSmartTag
        {
            get
            {
                return false;
            }
        }
    }

        讀到這裡相信大家已經託管出一個屬於自己的工作流程設計工具了,後面我們接著說說工具箱的定義和其他一些相關內容。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.