国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > .NET > 正文

從頭創(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
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 犍为县| 河西区| 布尔津县| 隆尧县| 弥勒县| 陕西省| 南溪县| 稷山县| 陈巴尔虎旗| 和林格尔县| 霞浦县| 互助| 龙山县| 卢龙县| 泰宁县| 阿坝县| 丹东市| 四川省| 专栏| 乌兰浩特市| 沂水县| 南平市| 子长县| 榕江县| 玉环县| 汽车| 青阳县| 荥经县| 高平市| 瑞安市| 恩平市| 南木林县| 沙雅县| 北京市| 克什克腾旗| 凯里市| 鄂托克旗| 镇安县| 永修县| 小金县| 麟游县|