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

标签 .net vb.net user-controls controls

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

解析 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 - 拦截/覆盖自定义控件上的 Name 属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10855065/

相关文章:

c# - 加载 X509Certificate2 结束并出现 Windows Server 2012 上发生内部错误

.net - 您能解释一下为什么 DirectoryInfo.GetFiles 会产生这个 IOException 吗?

asp.net vb 用户控件在调用页面上引发事件

wpf - 标记 "xxx"在 XML 命名空间“yyy”中不存在/找不到引用

.net - 为什么我不能使用 IntelliTrace for VS 2010 检查局部变量?

c# - 使用 OpenProcess 和 ReadProcessMemory 的问题

vb.net - 如何使用最小起订量发起事件?

python - 通过 VB 运行 Python 脚本时遇到问题

Silverlight mvvm 动态控件

c# - ASP.Net Core 在运行时注册 Controller