gpt4 book ai didi

.net - 拦截/覆盖自定义控件上的名称属性?

转载 作者:行者123 更新时间:2023-12-04 18:20:07 31 4
gpt4 key购买 nike

我有一个标签控件的自定义版本(使用用户控件构建)。在设计器中工作时,我想截取 Name 属性的设置(在属性面板中)并使用它来生成 Text 属性。也就是说,如果我在属性面板的 Name 属性中输入“lblFirstName”,我想立即看到 Text 属性设置为“First Name”。

解析 Name 属性不是问题;我能做到。

我试图重载/隐藏 Name 属性(因为不允许“覆盖”)以本质上将此“方面”添加到我们的自定义标签控件中,但它似乎在设计时并没有命中 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 属性。我怀疑这会更容易,因为它还应该反射(reflect) Designer.vb 代码中的新名称,而不仅仅是标签的 Name 属性本身。

最佳答案

您可以使用一些额外的设计时元素来做到这一点。 IComponentChangeService是您设计时间更改事件的钩子(Hook)。

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

MSDN - ISite

编辑 : 添加了处理代码!

关于.net - 拦截/覆盖自定义控件上的名称属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10855065/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com