寫C#自訂控制項的心得

來源:互聯網
上載者:User
使用C#也有一段時間了,但從未自已設計過自訂控制項,剛剛完成了一個自訂控制項的設計,覺得有一些技巧和知識,可以做一個總結.
    有些東西,從MSDN中很不容易找到,比如對一些屬性的描述設定.這裡可以為此做一些匯兌.
    我設計了一個平滑進度條控制項,這在網上很容易找到一些現成的.不過,為了學習控制項的設計,我還是自己寫了一個.
    這個控制項繼承自UserControl類.原理很簡單,就是用刷子往一定的地區裡面填充顏色.
    設計控制項當然要有一些屬性,進度條設計中最主要的屬性就是最小值,最大值及當前值.有了屬性在VS設計器中也要有所反映,就需要對這個屬性進行描述.
    就拿最小值這個屬性來說吧.在VS設計器選中這個屬性就需要有它的描述性文字以及它所屬的欄目.實現這兩個方面可以在屬性前加上這樣一行文字:
    [Description("擷取或設定目前進度條範圍最小值"), Category("行為")]
    這樣在VS設計器中該屬性就會看起來跟其它屬性一樣了.當然也可以將欄目的漢字換為英文,但目前我不知道行為在此中用什麼英文表示,但外觀是使用Appearance來表示.
    除了描述性文字及所屬欄目還可以有預設值,這是很多屬性都有的.加上DefaultValue(object value), 就可以應用預設值了.
    在VS的屬性設計器中,經常有這樣的屬性,比如字型,點擊後會出現一個字型編輯器,對於此類在VS設計器中存在的編輯器,我們可以直接使用它.
    比如編輯一個字型屬性.
    [Description("用於顯示控制項中文本的字型"), Category("Appearance")]
    public override Font Font
    {
     get { return m_LabelFont; }
     set
     {
      m_LabelFont = value;
      this.Invalidate();
     }
    }
    定義了它的傳回值為Font,這樣在VS設計器中,就會出現與別的控制項字型一樣的字型編輯器.與此類似的還有Color屬性,BorderStyle屬性等.
    既然這個控制項繼承自UserControl類,那麼不可避免的會繼承一些我們不想在設計器中出現的屬性.比如TabStop屬性,我們不希望它應用在進度條身上,就必須要讓它在設計器中不可見.
    [Browsable(false)]
    public new bool TabStop
    {
     get { return base.TabStop;}
    }
    Browsable(bool value)語句可以使某個屬性可見或是隱藏.
    有些繼承的屬性需要重寫,不管是對它進行一定的改變操作還是要隱藏它.重寫時需要使用override或是new,有的父類屬性中使用的是virtual,但有些沒有.沒有使用virtual的屬性,在子類中就要使用new來修飾了.
    對於事件,繼承來的也有一些是不必要的,要隱藏事件,我也找了一些資料,在網上可不多見,只是在MSDN中費了半天勁才找到一句相關的語句.
    比如對於按鍵動作進度條也是不需要,就需要在設計器中隱藏該事件.
    [Browsable(false)]
    public new event EventHandler KeyDown;//www.elivn.com
    前面是隱藏語句,後面是事件,這樣做起來,比屬性成員要簡單一些吧. 只是在網路中搜尋了半天也沒有發現與此相關的東西.
    對此繪圖部分的操作,詳細的就不在這裡說了.這裡只是說一些建立控制項的基本東西.但是繪圖的操作主要放在一起,比如放在Paint事件中.在事件的尾部再執行一下邊框的繪製.
    當對進度條的當前值進行賦值操作時,需要在進度條內部觸發一個繪圖的操作,可以讓Paint事件被觸發.這裡就需要執行一個方法Invalidate(),這個方法宣布目前範圍為無效,然後觸發Paint事件.
    進度條的地區比較小,所以不太耗費圖形資源,但如果需要的圖形資源比較大,且繪圖操作觸發頻繁,就不能宣布所有地區為無效,只要宣布已經更新的地區為無效.在取得更新地區後,使用Invalidate(Rectangle rect)方法,可以只更新部分地區.
    對於圖形控制項,很多操作都需要使用Graphics類繪圖,對這個龐大的類,我沒有深入的研究,也不能在此多說,不然會說個沒完.
    對於進度條類,也有一些描述,比如給它一個表徵圖,一個預設的屬性.在這個類中我仍然使用了.net中進度條的表徵圖.
    [ToolboxBitmap(typeof(ProgressBar)), DefaultProperty("Value")]
    在VS設計器中加入平滑進度條之後,在工具面板中出現的進度條表徵圖將是一個我們熟悉的進度條表徵圖.當然,我們也可以使用地址路徑或資源中的表徵圖來代替它.
    相對的語句為:ToolboxBitmap(路徑)

    對於控制項的設計,我剛剛才開始涉及,很多東西沒有發現.望有研究的同仁給予贊助.謝謝. 

聯繫我們

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