【问题标题】:Intercepting/overriding Name property on custom control?拦截/覆盖自定义控件上的名称属性?
【发布时间】:2012-06-06 23:27:19
【问题描述】:

我有一个自定义版本的标签控件(使用用户控件构建)。在设计器中工作时,我想截取 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 属性。我怀疑这会更容易,因为它还应该反映 Designer.vb 代码中的新名称,而不仅仅是标签的 Name 属性本身。

【问题讨论】:

    标签: .net vb.net user-controls controls


    【解决方案1】:

    您可以使用一些额外的设计时元素来做到这一点。 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

    MSDN - ISite

    EDIT:添加了处理代码!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-08
      • 2014-08-18
      • 1970-01-01
      • 2017-05-02
      相关资源
      最近更新 更多