十年網(wǎng)站開(kāi)發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶 + 靠譜的建站團(tuán)隊(duì)
量身定制 + 運(yùn)營(yíng)維護(hù)+專業(yè)推廣+無(wú)憂售后,網(wǎng)站問(wèn)題一站解決
有些東西,從MSDN中很不容易找到,比如對(duì)一些屬性的描述設(shè)定.這里可以為此做一些匯兌.

創(chuàng)新互聯(lián)建站專業(yè)為企業(yè)提供彭州網(wǎng)站建設(shè)、彭州做網(wǎng)站、彭州網(wǎng)站設(shè)計(jì)、彭州網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁(yè)設(shè)計(jì)與制作、彭州企業(yè)網(wǎng)站模板建站服務(wù),10多年彭州做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價(jià)值的思路和整體網(wǎng)絡(luò)服務(wù)。
我設(shè)計(jì)了一個(gè)平滑進(jìn)度條自定義C#控件,這在網(wǎng)上很容易找到一些現(xiàn)成的.不過(guò),為了學(xué)習(xí)自定義C#控件的設(shè)計(jì),我還是自己寫(xiě)了一個(gè).
這個(gè)自定義C#控件繼承自UserControl類.原理很簡(jiǎn)單,就是用刷子往一定的區(qū)域里面填充顏色.
設(shè)計(jì)自定義C#控件當(dāng)然要有一些屬性,進(jìn)度條設(shè)計(jì)中最主要的屬性就是最小值,最大值及當(dāng)前值.有了屬性在VS設(shè)計(jì)器中也要有所反映,就需要對(duì)這個(gè)屬性進(jìn)行描述.
就拿最小值這個(gè)屬性來(lái)說(shuō)吧.在VS設(shè)計(jì)器選中這個(gè)屬性就需要有它的描述性文字以及它所屬的欄目.實(shí)現(xiàn)這兩個(gè)方面可以在屬性前加上這樣一行文字:
[Description("獲取或設(shè)置目前進(jìn)度條范圍最小值"),Category("行為")]
這樣在VS設(shè)計(jì)器中該屬性就會(huì)看起來(lái)跟其它屬性一樣了.當(dāng)然也可以將欄目的漢字換為英文,但目前我不知道行為在此中用什么英文表示,但外觀是使用Appearance來(lái)表示.
除了描述性文字及所屬欄目還可以有缺省值,這是很多屬性都有的.加上DefaultValue(objectvalue),就可以應(yīng)用缺省值了.
在VS的屬性設(shè)計(jì)器中,經(jīng)常有這樣的屬性,比如字體,點(diǎn)擊后會(huì)出現(xiàn)一個(gè)字體編輯器,對(duì)于此類在VS設(shè)計(jì)器中存在的編輯器,我們可以直接使用它.
比如編輯一個(gè)字體屬性.
- [Description("用于顯示控件中文本的字體"),Category("Appearance")]
- publicoverrideFontFont
- {
- get{returnm_LabelFont;}
- set
- {
- m_LabelFont=value;
- this.Invalidate();
- }
- }
定義了它的返回值為Font,這樣在VS設(shè)計(jì)器中,就會(huì)出現(xiàn)與別的控件字體一樣的字體編輯器.與此類似的還有Color屬性,BorderStyle屬性等.
既然這個(gè)控件繼承自UserControl類,那么不可避免的會(huì)繼承一些我們不想在設(shè)計(jì)器中出現(xiàn)的屬性.比如TabStop屬性,我們不希望它應(yīng)用在進(jìn)度條身上,就必須要讓它在設(shè)計(jì)器中不可見(jiàn).
- [Browsable(false)]
- publicnewboolTabStop
- {
- get{returnbase.TabStop;}
- }
Browsable(boolvalue)語(yǔ)句可以使某個(gè)屬性可見(jiàn)或是隱藏.
有些繼承的屬性需要重寫(xiě),不管是對(duì)它進(jìn)行一定的改變操作還是要隱藏它.重寫(xiě)時(shí)需要使用override或是new,有的父類屬性中使用的是virtual,但有些沒(méi)有.沒(méi)有使用virtual的屬性,在子類中就要使用new來(lái)修飾了.
對(duì)于事件,繼承來(lái)的也有一些是不必要的,要隱藏事件,我也找了一些資料,在網(wǎng)上可不多見(jiàn),只是在MSDN中費(fèi)了半天勁才找到一句相關(guān)的語(yǔ)句.
比如對(duì)于按鍵操作進(jìn)度條也是不需要,就需要在設(shè)計(jì)器中隱藏該事件.
- [Browsable(false)]
- publicneweventEventHandlerKeyDown;
前面是隱藏語(yǔ)句,后面是事件,這樣做起來(lái),比屬性成員要簡(jiǎn)單一些吧.:)只是在網(wǎng)絡(luò)中搜索了半天也沒(méi)有發(fā)現(xiàn)與此相關(guān)的東西.
對(duì)此繪圖部分的操作,詳細(xì)的就不在這里說(shuō)了.這里只是說(shuō)一些建立控件的基本東西.但是繪圖的操作主要放在一起,比如放在Paint事件中.在事件的尾部再執(zhí)行一下邊框的繪制.
當(dāng)對(duì)進(jìn)度條的當(dāng)前值進(jìn)行賦值操作時(shí),需要在進(jìn)度條內(nèi)部觸發(fā)一個(gè)繪圖的操作,可以讓Paint事件被觸發(fā).這里就需要執(zhí)行一個(gè)方法Invalidate(),這個(gè)方法宣布當(dāng)前區(qū)域?yàn)闊o(wú)效,然后觸發(fā)Paint事件.
進(jìn)度條的區(qū)域比較小,所以不太耗費(fèi)圖形資源,但如果需要的圖形資源比較大,且繪圖操作觸發(fā)頻繁,就不能宣布所有區(qū)域?yàn)闊o(wú)效,只要宣布已經(jīng)更新的區(qū)域?yàn)闊o(wú)效.在取得更新區(qū)域后,使用Invalidate(Rectanglerect)方法,可以只更新部分區(qū)域.
對(duì)于圖形自定義C#控件,很多操作都需要使用Graphics類繪圖,對(duì)這個(gè)龐大的類,我沒(méi)有深入的研究,也不能在此多說(shuō),不然會(huì)說(shuō)個(gè)沒(méi)完.;)
對(duì)于進(jìn)度條類,也有一些描述,比如給它一個(gè)圖標(biāo),一個(gè)缺省的屬性.在這個(gè)類中我仍然使用了.NET中進(jìn)度條的圖標(biāo).
- [ToolboxBitmap(typeof(ProgressBar)),DefaultProperty("Value")]
在Visual Studio設(shè)計(jì)器中加入平滑進(jìn)度條之后,在工具面板中出現(xiàn)的進(jìn)度條圖標(biāo)將是一個(gè)我們熟悉的進(jìn)度條圖標(biāo).當(dāng)然,我們也可以使用地址路徑或資源中的圖標(biāo)來(lái)代替它.
相對(duì)的語(yǔ)句為:ToolboxBitmap(路徑)
【編輯推薦】