从头创建 Visual Basic .NET 控件 (四)
点击次数:15 次 发布日期:2008-11-26 23:57:57 作者:源代码网
|
源代码网推荐 要实现 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 源代码网推荐 源代码网供稿. |
