2012-06-01 73 views
2

我有一個自定義版本的標籤控件(使用用戶控件構建)。在設計師工作時,我想攔截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屬性本身。

回答

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

MSDN - ISite

編輯:添加配置代碼!

+0

這使我走上了正確的道路。謝謝。 – Mario

+0

@Mario很高興它幫助,謝謝。 –