#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
Чтобы принудительно вызвать событие, а затем вызвать изменение размера метки.
Так что это выглядит решаемым, но если у кого-нибудь есть объяснение, я был бы рад его узнать.