#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. Конечно, вы правы, но я не могу найти галочку для справки, пожалуйста, покажите мне …. спасибо еще раз