一個簡單易用的嚮導控制項:ETWizard

來源:互聯網
上載者:User
涉及使用者控制項,大多隻關注控制項本身,以及dll,源碼,很少關注其實現的過程。
嚮導控制項在winform開發中,經常能夠用到,最近我參考了GuiWizard,自己實現了一個嚮導控制項,用起來覺得還可以,現與大家分享。
首先將該控制項實現的幾個要點說一下。
1.使用者控制項,先需要做一個嚮導介面(ETWizard),包括底部(包含Back,Next,Cancel/Finish按鈕),頂部(包含嚮導頁面的Title以及Tip/Description),中間部分(該部分用於顯示具體的嚮導頁)。
2.實現一個嚮導頁類:ETWizardPage,該類繼承自Panel。用於在設計模式下給嚮導控制項添加/編輯嚮導頁。
 a)如何?頁面的切換,這個實現的思路我參考了GuiWizard的實現思路,即給嚮導頁(ETWizardPage)添加了四個事件:CloseWhenNext,CloseWhenBack,ShowWhenNext,ShowWhenBack。通過調用這四個事件來實現不同頁面的切換。
 b)在嚮導頁的翻頁事件中,定義了一個嚮導事件類別:ETPageEventArgs,該事件提供兩個公有屬性:Page,PageIndex。這個事件直接採用GuiWizard中的PageEventArgs類。
 c)如何?每個頁面的輸入校正,以及頁面的操作執行。我提供了三個事件來完成:ValidateWhenNext,ExecuteWhenNext,ExecuteWhenBack。給指定的ETWizardPage頁添加這三個事件來控制該頁的校正,以及操作執行。
 d)對所有嚮導頁的管理,我直接使用了GuiWizard中的PageCollection(:CollectionBase)的實現來對嚮導頁集合進行基本的管理。
 e)給嚮導頁添加設計器:ETPageDesigner。主要提供對對象的刪除。該設計器需要重寫Verbs屬性。Code
public override DesignerVerbCollection Verbs
        {
            get
            {
                DesignerVerbCollection verbs = new DesignerVerbCollection();
                verbs.Add(new DesignerVerb("Remove page", new EventHandler(ETWizardPage_Remove)));
                return verbs ;
            }
        }

ETWizardPage_Remove方法的實現如下:ETWizardPage_Remove的基本實現
ETWizardPage page = Control as ETWizardPage;
            if (page == null)
                return;
            IDesignerHost host = (IDesignerHost)GetService(typeof(IDesignerHost));
            IComponentChangeService service = (IComponentChangeService)GetService(typeof(IComponentChangeService));
            DesignerTransaction transaction = host.CreateTransaction("Remove page");

            if (page.Wizard == null)
                return;
            int iLoc = -1;
            ETWizard wizard = page.Wizard ;
            int index = wizard.Pages.IndexOf(page);
            if (index < wizard.Pages.Count - 1)
                iLoc = index;
            else
                iLoc = index - 1;

            service.OnComponentChanging(wizard, null);
            wizard.Pages.Remove(page);
            wizard.Controls.Remove(page);
            service.OnComponentChanged(wizard, null, null, null);
            host.DestroyComponent(page);

            if (iLoc >= 0 && wizard.Pages.Count > iLoc)
                wizard.ActivatePage(iLoc);
            transaction.Commit();

3.給嚮導控制項(ETWizard)添加設計器:ETWizardDesigner。
重寫DrawGrid,Verbs等屬性,以及CanParent,GetHitTest,OnDragEnter,OnPaintAdornments等方法。
主要部分仍然在於給設計器添加一個“Add page”的功能。基本的實現方法如上面ETWizardPageDesigner的Remove page的實現。
由於要講ETWizardPage添加到ETWizard中特定的panel中去,所以需要重寫ETWizard的OnControlAdded和OnControlRemoved兩個事件。
4.ETWizard與其他嚮導控制項的不同之處。
在實現上,控制項簡潔,沒有提供複雜的Head實現,只提供簡單的頂部資訊(Title,Tip)。控制項的Title/Tip會自動顯示當前顯示頁的Title/Tip。增加了嚮導頁的校正以及執行兩個事件,允許使用者寫自己的頁面校正函數,以及頁面執行方法。整個控制項代碼不多,比較簡單。

源碼下載:ETWizard

如果大家又什麼好的意見或建議,希望能夠提出來,讓我們大家得以共同進步。謝謝。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.