.NET унаследованная метка не изменяется автоматически

#vb.net #winforms #label

#vb.net #winforms #метка

Вопрос:

Я бы хотел наследовать от Windows.Формы.Метка, поэтому я сделал что-то подобное:

 Public Class CustomLabel
    Inherits Label

    Public Property CustomText As String

    Protected Property DefaultText as 

    Public Overrides Property Text As String
        Get
            Return If(CustomText <> "", CustomText, MyBase.Text)
        End Get
        Set(value As String)
            MyBase.Text = value
        End Set
    End Property
End Class
 

Проблема заключается в использовании этого, даже если свойство AutoSize по-прежнему имеет значение true, метка сохраняет свой первоначальный размер независимо от значения, установленного в CustomText.

Итак, я подумал, что Mybase.Свойство Text не обновляется, если для параметра CustomText установлено значение Я изменил на :

 Public Class CustomLabel
    Inherits Label

    Public Property CustomText As String
        Get
            Return _txt
        End Get
        Set(value As String)
            _txt = value
            MyBase.Text = value
        End Set
    End Property

    Protected _txt As String

    Protected Property DefaultText As String

    Public Overrides Property Text As String
        Get
            Return If(CustomText <> "", CustomText, DefaultText)
        End Get
        Set(value As String)
            DefaultText = value
        End Set
    End Property
End Class
 

Но все та же проблема.

И, с другой стороны, когда я устанавливаю свойство Text для стандартной метки в том же месте кода, где я устанавливаю свою пользовательскую метку, автоматический размер работает.

Есть идеи? Спасибо

Ответ №1:

После нескольких других попыток я проверил, как вызывается событие TextChanged. Похоже, что элемент управления сначала инициализируется дизайнером, а для пользовательского текста установлено значение nothing, и, как и ожидалось, вызывается событие TextChanged.

Однако позже в коде, когда свойству CustomText присваивается требуемое значение, я не знаю почему, но событие не вызывается, даже если строка строго отличается.

Итак, чтобы получить работающий код, я должен написать:

 Public Property CustomText As String
    Get
        Return _txt
    End Get
    Set(value As String)
        _txt = value
        OnTextChanged(EventArgs.Empty) 'instead of Mybase.Text = value
    End Set
End Property
 

Чтобы принудительно вызвать событие, а затем вызвать изменение размера метки.

Так что это выглядит решаемым, но если у кого-нибудь есть объяснение, я был бы рад его узнать.