天天看點

C#編寫自定義控件心得

有些東西,從MSDN中很不容易找到,比如對一些屬性的描述設定.這裡可以為此做一些彙兌.

    我設計了一個平滑進度條自定義C#控件,這在網上很容易找到一些現成的.不過,為了學習自定義C#控件的設計,我還是自己寫了一個.

    這個自定義C#控件繼承自UserControl類.原理很簡單,就是用刷子往一定的區域裡面填充顔色.

    設計自定義C#控件當然要有一些屬性,進度條設計中最主要的屬性就是最小值,最大值及目前值.有了屬性在VS設計器中也要有所反映,就需要對這個屬性進行描述.

    就拿最小值這個屬性來說吧.在VS設計器選中這個屬性就需要有它的描述性文字以及它所屬的欄目.實作這兩個方面可以在屬性前加上這樣一行文字:

    [Description("擷取或設定目前進度條範圍最小值"),Category("行為")]

    這樣在VS設計器中該屬性就會看起來跟其它屬性一樣了.當然也可以将欄目的漢字換為英文,但目前我不知道行為在此中用什麼英文表示,但外觀是使用Appearance來表示.

    除了描述性文字及所屬欄目還可以有預設值,這是很多屬性都有的.加上DefaultValue(objectvalue),就可以應用預設值了.

    在VS的屬性設計器中,經常有這樣的屬性,比如字型,點選後會出現一個字型編輯器,對于此類在VS設計器中存在的編輯器,我們可以直接使用它.

    比如編輯一個字型屬性.

  1. [Description("用于顯示控件中文本的字型"),Category("Appearance")]
  2. public override Font Font
  3. {
  4. get{return m_LabelFont;}
  5. set
  6. {
  7. m_LabelFont=value;
  8. this.Invalidate();
  9. }
  10. }

    定義了它的傳回值為Font,這樣在VS設計器中,就會出現與别的控件字型一樣的字型編輯器.與此類似的還有Color屬性,BorderStyle屬性等.

    既然這個控件繼承自UserControl類,那麼不可避免的會繼承一些我們不想在設計器中出現的屬性.比如TabStop屬性,我們不希望它應用在進度條身上,就必須要讓它在設計器中不可見.

  1. [Browsable(false)]
  2. public new bool TabStop
  3. {
  4. get{return base.TabStop;}
  5. }

    Browsable(bool value)語句可以使某個屬性可見或是隐藏.

    有些繼承的屬性需要重寫,不管是對它進行一定的改變操作還是要隐藏它.重寫時需要使用override或是new,有的父類屬性中使用的是virtual,但有些沒有.沒有使用virtual的屬性,在子類中就要使用new來修飾了.

    對于事件,繼承來的也有一些是不必要的,要隐藏事件,我也找了一些資料,在網上可不多見,隻是在MSDN中費了半天勁才找到一句相關的語句.

    比如對于按鍵操作進度條也是不需要,就需要在設計器中隐藏該事件.

  1. [Browsable(false)]
  2. public new event EventHandler KeyDown;

    前面是隐藏語句,後面是事件,這樣做起來,比屬性成員要簡單一些吧.:)隻是在網絡中搜尋了半天也沒有發現與此相關的東西.

    對此繪圖部分的操作,詳細的就不在這裡說了.這裡隻是說一些建立控件的基本東西.但是繪圖的操作主要放在一起,比如放在Paint事件中.在事件的尾部再執行一下邊框的繪制.

    當對進度條的目前值進行指派操作時,需要在進度條内部觸發一個繪圖的操作,可以讓Paint事件被觸發.這裡就需要執行一個方法Invalidate(),這個方法宣布目前區域為無效,然後觸發Paint事件.

    進度條的區域比較小,是以不太耗費圖形資源,但如果需要的圖形資源比較大,且繪圖操作觸發頻繁,就不能宣布所有區域為無效,隻要宣布已經更新的區域為無效.在取得更新區域後,使用Invalidate(Rectanglerect)方法,可以隻更新部分區域.

    對于圖形自定義C#控件,很多操作都需要使用Graphics類繪圖,對這個龐大的類,我沒有深入的研究,也不能在此多說,不然會說個沒完.;)

    對于進度條類,也有一些描述,比如給它一個圖示,一個預設的屬性.在這個類中我仍然使用了.NET中進度條的圖示.

  1. [ToolboxBitmap(typeof(ProgressBar)),DefaultProperty("Value")]

    在Visual Studio設計器中加入平滑進度條之後,在工具面闆中出現的進度條圖示将是一個我們熟悉的進度條圖示.當然,我們也可以使用位址路徑或資源中的圖示來代替它.

   相對的語句為:ToolboxBitmap(路徑)