從頭建立 Visual Basic .NET 控制項 (四)

來源:互聯網
上載者:User
visual|建立|控制項 第 3 步:實現屬性和事件
要實現 Status 屬性,首先要為可能的屬性值建立枚舉。將以下幾行插入以 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 屬性的屬性值,還為這些屬性設定了預設值。儲存 BorderWidth 的變數必須為 Single 類型,因為它是繪製邊框所用的圖形語句需要的類型。預設值中的驚歎號也表明它是 Single 類型。此集合中的最後一行聲明了 StatusChanged 事件。

現在,我們為 BorderWidth 屬性編寫代碼。在標記為 Windows Form Designer Generated Code(Windows 表單設計器產生的程式碼)的代碼地區下插入以下行:

<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 屬性的預設值,那麼表單設計器將不產生設定屬性值的程式碼。這使它與其他 Windows 表單控制項沒有什麼區別。如果您查看典型控制項(如 TextBox)的設計器產生的程式碼,您會發現只包括設定為非預設值的屬性的程式碼。我們賦予 TrafficLight 控制項同樣的能力。

Property Get 簡單明了。Property Set 子句包括可視控制項屬性中常見的邏輯。設定屬性時,重要的是在新屬性值更改控制項的外觀時要能夠重新繪製控制項。因此,Set 子句負責確定傳遞的新值是否與屬性中現有的值不相同。如果相同,則不執行操作。如果不同,則接受新值,然後訪問控制項的 Invalidate 方法。此方法表明,控制項的可視地區已到期,控制項需要重新繪製。

Status 屬性的處理有些不同,因為它是枚舉值。DefaultValue 特性沒有為枚舉屬性提供自動重設能力。在這種情況下,DefaultValue 也無法告訴設計器何時停止設定屬性值的代碼。因此,Status 屬性的實現中不需要 DefaultValue 特性。下面是 Status 屬性的代碼:

<Description("紅綠燈的狀態(顏色)")> _
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 屬性的實作類別似,只有一點不同:當 Status 屬性發生改變時,除了強制重新繪製控制項外,還會觸發 StatusChanged 事件。

要在 Properties(屬性)視窗中處理屬性的自動重設,我們需要使用一種特殊的方法。由於我們的屬性命名為 Status,因此必須將重設方法命名為 ResetStatus。重設方法只是恢複屬性的預設值。以下是其代碼:

Public Sub ResetStatus()
    Me.Status = TrafficLightStatus.statusGreen
End Sub

為了提示設計器何時需要包括一行代碼以便設定 Status 屬性,我們需要包括一個名為 ShouldSerializeStatus 的方法。當屬性需要一行代碼時,此方法返回布爾值 True,否則,則返回 False。以下是其代碼:

Public Function ShouldSerializeStatus() As Boolean
    If mStatus = TrafficLightStatus.statusGreen Then
        Return False
    Else
        Return True
    End If
End Function


相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。