從頭創(chuàng)建 Visual Basic .NET 控件 (四)
2024-07-10 13:04:02
供稿:網(wǎng)友
第 3 步:實現(xiàn)屬性和事件
要實現(xiàn) status 屬性,首先要為可能的屬性值創(chuàng)建枚舉。將以下幾行插入以 inherits 開始的行下面:
public enum trafficlightstatus
statusred = 1
statusyellow = 2
statusgreen = 3
end enum
此枚舉是公開的,也就是說使用該控件的窗體可以訪問它。
在這些行下面添加以下三行:
dim mstatus as trafficlightstatus = trafficlightstatus.statusgreen
dim msngborderwidth as single = 1.0!
public event statuschanged(byval newstatus as trafficlightstatus)
前兩行中的兩個變量可用于存儲 status 和 borderwidth 屬性的屬性值,還為這些屬性設(shè)置了默認值。保存 borderwidth 的變量必須為 single 類型,因為它是繪制邊框所用的圖形語句需要的類型。默認值中的驚嘆號也表明它是 single 類型。此集合中的最后一行聲明了 statuschanged 事件。
現(xiàn)在,我們?yōu)?borderwidth 屬性編寫代碼。在標(biāo)記為 windows form designer generated code(windows 窗體設(shè)計器生成的代碼)的代碼區(qū)域下插入以下行:
<defaultvalue(1.0!), _
description("紅綠燈周圍邊框的寬度")> _
public property borderwidth() as single
get
return msngborderwidth
end get
set(byval value as single)
if msngborderwidth <> value then
msngborderwidth = value
me.invalidate()
end if
end set
end property
前兩行包括使該屬性更好地使用 ide 的屬性。defaultvalue 特性允許在 properties(屬性)窗口中將屬性值重置為默認值(操作步驟稍后介紹)。description 特性提供選中該屬性時在 properties(屬性)窗口底部顯示的文本。
defaultvalue 特性還有一個技巧。如果將 trafficlight 控件放到窗體上,并保留 borderwidth 屬性的默認值,那么窗體設(shè)計器將不生成設(shè)置屬性值的代碼行。這使它與其他 windows 窗體控件沒有什么區(qū)別。如果您查看典型控件(如 textbox)的設(shè)計器生成的代碼,您會發(fā)現(xiàn)只包括設(shè)置為非默認值的屬性的代碼行。我們賦予 trafficlight 控件同樣的能力。
property get 簡單明了。property set 子句包括可視控件屬性中常見的邏輯。設(shè)置屬性時,重要的是在新屬性值更改控件的外觀時要能夠重新繪制控件。因此,set 子句負責(zé)確定傳遞的新值是否與屬性中現(xiàn)有的值不相同。如果相同,則不執(zhí)行操作。如果不同,則接受新值,然后訪問控件的 invalidate 方法。此方法表明,控件的可視區(qū)域已過期,控件需要重新繪制。
status 屬性的處理有些不同,因為它是枚舉值。defaultvalue 特性沒有為枚舉屬性提供自動重置能力。在這種情況下,defaultvalue 也無法告訴設(shè)計器何時停止設(shè)置屬性值的代碼。因此,status 屬性的實現(xiàn)中不需要 defaultvalue 特性。下面是 status 屬性的代碼:
<description("紅綠燈的狀態(tài)(顏色)")> _
public property status() as trafficlightstatus
get
status = mstatus
end get
set(byval value as trafficlightstatus)
if mstatus <> value then
mstatus = value
raiseevent statuschanged(mstatus)
me.invalidate()
end if
end set
end property
看起來與 borderwidth 屬性的實現(xiàn)類似,只有一點不同:當(dāng) status 屬性發(fā)生改變時,除了強制重新繪制控件外,還會觸發(fā) statuschanged 事件。
要在 properties(屬性)窗口中處理屬性的自動重置,我們需要使用一種特殊的方法。由于我們的屬性命名為 status,因此必須將重置方法命名為 resetstatus。重置方法只是恢復(fù)屬性的默認值。以下是其代碼:
public sub resetstatus()
me.status = trafficlightstatus.statusgreen
end sub
為了提示設(shè)計器何時需要包括一行代碼以便設(shè)置 status 屬性,我們需要包括一個名為 shouldserializestatus 的方法。當(dāng)屬性需要一行代碼時,此方法返回布爾值 true,否則,則返回 false。以下是其代碼:
public function shouldserializestatus() as boolean
if mstatus = trafficlightstatus.statusgreen then
return false
else
return true
end if
end function