создайте пользовательскую метку со свойством borderColor

#vb.net #user-controls

#vb.net #пользовательские элементы управления

Вопрос:

Я пытаюсь создать метку со свойством borderColor. но это не работает. Я создаю мгновенный объект этой метки в своем приложении формы и пытаюсь изменить цвет границы, но ничего не происходит. это мой код :

 Public Class MyLabel
Inherits Label

Private _BorderColor As Color
Dim e As New PaintEventArgs(Me.CreateGraphics, Me.DisplayRectangle)

Public Property BorderColor As Color
    Get
        Return _BorderColor
    End Get
    Set(value As Color)
        _BorderColor = value
        CreateBorder(value)
    End Set
End Property

Private Sub CreateBorder(ByVal value As Color)
    Dim g As Graphics = Me.CreateGraphics
    Dim p As Pen = New Pen(value, 2)
    g.DrawRectangle(p, Me.DisplayRectangle)
End Sub

Private Sub MyLabel_Paint(sender As Object, e As PaintEventArgs) Handles Me.Paint
    CreateBorder(_BorderColor)
End Sub
  

Конечный класс

Ответ №1:

Нет, нет и двойное нет. Вы НЕ вызываете CreateGraphics . Graphics Объект предоставляется вам Paint событием, и вы его используете. Кроме того, вы не обрабатываете Paint событие в пользовательском элементе управления, а переопределяете OnPaint метод. Кроме того, если у вас есть метод, который выполняет рисование, например CreateBorder , тогда вы НЕ вызываете его ниоткуда, кроме OnPaint метода. Если вы хотите убедиться, что граница будет перерисована при следующем событии, тогда вы вызываете Invalidate . Например.

 Public Class BorderedLabel
    Inherits Label

    Private _borderColor As Color

    Property BorderColor As Color
        Get
            Return _borderColor
        End Get
        Set
            _borderColor = Value
            Invalidate()
        End Set
    End Property

    Protected Overrides Sub OnPaint(e As PaintEventArgs)
        MyBase.OnPaint(e)

        Using p As New Pen(BorderColor, 2)
            e.Graphics.DrawRectangle(p, DisplayRectangle)
        End Using
    End Sub

End Class
  

Комментарии:

1. …вы также не изменяете PaintEventArgs

2. Используйте Invalidate(), никогда не обновляйте().

3. @HansPassant, я бы сказал, что в коде приложения уместно вызывать Refresh , если вы конкретно хотите убедиться, что перерисовка происходит сейчас. Однако в управляющем коде вы, вероятно, правы, Invalidate это более уместно. Я внес изменения, указанные выше.

Ответ №2:

Спасибо… теперь это работает, это новый код :

 Public Class MyLabel
Inherits Label

Private _BorderColor As Color
Private _BorderSize As Single = 1.0F

Public Property BorderColor As Color
    Get
        Return _BorderColor
    End Get
    Set(value As Color)
        _BorderColor = value
        Refresh()
    End Set
End Property

Public Property BorderSize As Single
    Get
        Return _BorderSize
    End Get
    Set(value As Single)
        _BorderSize = value
    End Set
End Property

Private Sub CreateBorder(ByVal value As Color, ByVal e As PaintEventArgs)
    Dim g As Graphics = e.Graphics
    Dim p As Pen = New Pen(value, _BorderSize)
    g.DrawRectangle(p, Me.DisplayRectangle)
End Sub

Private Sub MyLabel_Paint(sender As Object, e As PaintEventArgs) Handles Me.Paint
    CreateBorder(_BorderColor, e)
End Sub
  

Конечный класс

Комментарии:

1. Существует очень небольшая разница между этим и ответом г-на jmcilhinney. Будьте любезны за помощь и установите флажок рядом с этим ответом.

2. Конечно, вы правы, но я не могу найти галочку для справки, пожалуйста, покажите мне …. спасибо еще раз