2

カスタム バージョンのラベル コントロール (ユーザー コントロールを使用して作成) があります。デザイナーでの作業中に、(プロパティ パネルの) Name プロパティの設定をインターセプトし、それを使用して Text プロパティを生成したいと考えています。つまり、プロパティ パネルの Name プロパティに「lblFirstName」と入力すると、Text プロパティが「First Name」に設定されていることがすぐにわかります。

Name プロパティの解析は問題ではありません。私はそれを行うことができます。

Name プロパティをオーバーロード/シャドウして ("Overrides" が許可されていないため)、この "アスペクト" をカスタム ラベル コントロールに本質的に追加しようとしましたが、設計時に 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 プロパティを設定できるようにすることもできます。ラベルの Name プロパティ自体だけでなく、Designer.vb コードの新しい名前も反映する必要があるため、これが簡単になるとは思えません。

4

1 に答える 1

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-ISet

編集:廃棄コードを追加しました!

于 2012-06-01T18:53:31.537 に答える