我有一个自定义版本的标签控件(使用用户控件构建)。在设计器中工作时,我想截取Name属性的设置(在属性面板中)并使用它来生成Text属性。也就是说,如果我在属性面板的Name属性中输入“lblFirstName”,我想立即看到Text属性设置为“First Name”。
解析Name属性不是问题;我能做到。
我试图重载/遮蔽Name属性(因为不允许使用“Overrides”)来基本上将这个“aspect”添加到我们的自定义标签控件中,但它似乎在设计时没有遇到Shadowed方法。如果通过代码操作,它确实在运行时命中了Shadowed方法。
重点是避免重复工作,因为标签文本和标签名称基本相同。唯一的区别是一个被格式化为人类友好,另一个机器友好。
<System.ComponentModel.Browsable(True),
System.ComponentModel.ParenthesizePropertyName(),
System.ComponentModel.DesignerSerializationVisibility(System.ComponentModel.DesignerSerializationVisibility.Visible)>
Public Shadows Property Name As String
Get
Return MyBase.Name
End Get
Set(value As String)
MyBase.Name = value
If Me.DesignMode Then
Me.Text = Humanize(value)
End If
Me.Invalidate()
End Set
End Property
这可能是选择正确属性的问题。我不确定。
相反,如果它是一个更容易的替代方法,我们可以允许设置Text属性来设置Name属性。我怀疑这会更容易,因为它还应该反映Designer.vb代码中的新名称,而不仅仅是标签的Name属性本身。
答案 0 :(得分:4)
您可以使用一些额外的设计时元素来完成此操作。 IComponentChangeService
是设计时间变化事件的钩子。
Imports System.ComponentModel.Design
Imports System.ComponentModel
Class RenameLabel
Inherits System.Windows.Forms.Label
Private WithEvents _compChServ As IComponentChangeService
Public Overrides Property Site() As ISite
Get
Return MyBase.Site
End Get
Set(ByVal Value As ISite)
If _compChServ IsNot Nothing Then _
RemoveHandler _compChServ.ComponentRename, AddressOf nameChanged
MyBase.Site = Value
_compChServ = CType(GetService(GetType(IComponentChangeService)), _
IComponentChangeService)
If _compChServ IsNot Nothing Then _
AddHandler _compChServ.ComponentRename, AddressOf nameChanged
End Set
End Property
Private Sub nameChanged(ByVal sender As Object, ByVal e As _
ComponentRenameEventArgs)
'Add your change code here
Me.Text = Me.Name
End Sub
Protected Overrides Sub Dispose(ByVal disposing As Boolean)
If disposing Then
If _compChServ IsNot Nothing Then _
RemoveHandler _compChServ.ComponentRename, AddressOf nameChanged
End If
MyBase.Dispose(disposing)
End Sub
End Class
MSDN - IComponentChangeService
编辑:添加了处理代码!