從頭創(chuàng)建 Visual Basic .NET 控件 (4)
發(fā)表時(shí)間:2023-07-14 來(lái)源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]第 3 步:實(shí)現(xiàn)屬性和事件要實(shí)現(xiàn) Status 屬性,首先要為可能的屬性值創(chuàng)建枚舉。將以下幾行插入以 Inherits 開(kāi)始的行下面:Public Enum TrafficLightStatusst...
第 3 步:實(shí)現(xiàn)屬性和事件
要實(shí)現(xiàn) Status 屬性,首先要為可能的屬性值創(chuàng)建枚舉。將以下幾行插入以 Inherits 開(kāi)始的行下面:
Public Enum TrafficLightStatus
statusRed = 1
statusYellow = 2
statusGreen = 3
End Enum
此枚舉是公開(kāi)的,也就是說(shuō)使用該控件的窗體可以訪問(wèn)它。
在這些行下面添加以下三行:
Dim mStatus As TrafficLightStatus = TrafficLightStatus.statusGreen
Dim msngBorderWidth As Single = 1.0!
Public Event StatusChanged(ByVal NewStatus As TrafficLightStatus)
前兩行中的兩個(gè)變量可用于存儲(chǔ) Status 和 BorderWidth 屬性的屬性值,還為這些屬性設(shè)置了默認(rèn)值。保存 BorderWidth 的變量必須為 Single 類型,因?yàn)樗抢L制邊框所用的圖形語(yǔ)句需要的類型。默認(rèn)值中的驚嘆號(hào)也表明它是 Single 類型。此集合中的最后一行聲明了 StatusChanged 事件。
現(xiàn)在,我們?yōu)?BorderWidth 屬性編寫(xiě)代碼。在標(biāo)記為 Windows Form Designer Generated Code(Windows 窗體設(shè)計(jì)器生成的代碼)的代碼區(qū)域下插入以下行:
<DefaultValue(1.0!), _
Description("紅綠燈周?chē)吙虻膶挾?quot;)> _
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(屬性)窗口中將屬性值重置為默認(rèn)值(操作步驟稍后介紹)。Description 特性提供選中該屬性時(shí)在 Properties(屬性)窗口底部顯示的文本。
DefaultValue 特性還有一個(gè)技巧。如果將 TrafficLight 控件放到窗體上,并保留 BorderWidth 屬性的默認(rèn)值,那么窗體設(shè)計(jì)器將不生成設(shè)置屬性值的代碼行。這使它與其他 Windows 窗體控件沒(méi)有什么區(qū)別。如果您查看典型控件(如 TextBox)的設(shè)計(jì)器生成的代碼,您會(huì)發(fā)現(xiàn)只包括設(shè)置為非默認(rèn)值的屬性的代碼行。我們賦予 TrafficLight 控件同樣的能力。
Property Get 簡(jiǎn)單明了。Property Set 子句包括可視控件屬性中常見(jiàn)的邏輯。設(shè)置屬性時(shí),重要的是在新屬性值更改控件的外觀時(shí)要能夠重新繪制控件。因此,Set 子句負(fù)責(zé)確定傳遞的新值是否與屬性中現(xiàn)有的值不相同。如果相同,則不執(zhí)行操作。如果不同,則接受新值,然后訪問(wèn)控件的 Invalidate 方法。此方法表明,控件的可視區(qū)域已過(guò)期,控件需要重新繪制。
Status 屬性的處理有些不同,因?yàn)樗敲杜e值。DefaultValue 特性沒(méi)有為枚舉屬性提供自動(dòng)重置能力。在這種情況下,DefaultValue 也無(wú)法告訴設(shè)計(jì)器何時(shí)停止設(shè)置屬性值的代碼。因此,Status 屬性的實(shí)現(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
看起來(lái)與 BorderWidth 屬性的實(shí)現(xiàn)類似,只有一點(diǎn)不同:當(dāng) Status 屬性發(fā)生改變時(shí),除了強(qiáng)制重新繪制控件外,還會(huì)觸發(fā) StatusChanged 事件。
要在 Properties(屬性)窗口中處理屬性的自動(dòng)重置,我們需要使用一種特殊的方法。由于我們的屬性命名為 Status,因此必須將重置方法命名為 ResetStatus。重置方法只是恢復(fù)屬性的默認(rèn)值。以下是其代碼:
Public Sub ResetStatus()
Me.Status = TrafficLightStatus.statusGreen
End Sub
為了提示設(shè)計(jì)器何時(shí)需要包括一行代碼以便設(shè)置 Status 屬性,我們需要包括一個(gè)名為 ShouldSerializeStatus 的方法。當(dāng)屬性需要一行代碼時(shí),此方法返回布爾值 True,否則,則返回 False。以下是其代碼:
Public Function ShouldSerializeStatus() As Boolean
If mStatus = TrafficLightStatus.statusGreen Then
Return False
Else
Return True
End If
End Function