2012-06-01 5 views
2

사용자 정의 버전의 레이블 컨트롤 (사용자 정의 컨트롤을 사용하여 작성)이 있습니다. 디자이너에서 작업하는 동안 속성 패널의 Name 속성 설정을 가로 채서 Text 속성을 생성하는 데 사용하려고합니다. 즉, 속성 패널의 Name 속성에 "lblFirstName"을 입력하면 Text 속성이 "First Name"으로 설정되었음을 즉시보고 싶습니다.사용자 정의 컨트롤의 Name 속성을 가로 채기/재정의 하시겠습니까?

Name 속성을 구문 분석하는 것은 문제가 아닙니다. 나는 그걸 할 수있어.

기본적으로이 "aspect"를 사용자 지정 레이블 컨트롤에 추가 할 수 있지만 Name 속성을 오버로드/섀도우하려고했으나 디자인 타임에 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 속성을 설정할 수 있습니다. 필자는 Label의 Name 속성 자체뿐만 아니라 Designer.vb 코드의 새 이름도 반영해야하므로이 방법이 더 쉽지 않을지는 의문입니다.

답변

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 기쁜 마음으로 도와 줘서 고마워. –

관련 문제