Я переоцениваю событие рисования узла для древовидной структуры в режиме рисования все, как показано в коде ниже.
Protected Overrides Sub OnDrawNode(ByVal e As System.Windows.Forms.DrawTreeNodeEventArgs)
Try
Dim Indent = e.Node.Level * Me.Indent + 32
Dim font = Me.Font
'draw selected
If e.State And TreeNodeStates.Selected Then
Dim rect As New Rectangle(0, e.Bounds.Location.Y, Me.Width - 1, e.Bounds.Height - 1)
e.Graphics.FillRectangle(Brushes.AliceBlue, rect)
e.Graphics.DrawRectangle(Pens.DarkSlateBlue, rect)
End If
'draw status icon
e.Graphics.DrawImage(Me.ImageList.Images(e.Node.ImageIndex), New Point(e.Bounds.X + indent - Me.ImageList.ImageSize.Width + 2, e.Bounds.Y + ((Me.ItemHeight / 2) - (Me.ImageList.ImageSize.Height / 2))))
'draw collapse glyph
If e.Node.Nodes.Count > 0 Then
Dim element As VisualStyleElement
Dim glyphRect = New Rectangle(e.Bounds.Location.X + 2 + e.Node.Level * Me.Indent, e.Bounds.Location.Y + 8, 16, 16)
If e.Node.IsExpanded Then
element = VisualStyleElement.TreeView.Glyph.Opened
Else
element = VisualStyleElement.TreeView.Glyph.Closed
End If
Dim renderer As New VisualStyleRenderer(element)
renderer.DrawBackground(e.Graphics, glyphRect)
End If
If e.Node.Level.Equals(0) Then
font = New Font(Me.Font.Name, 12, FontStyle.Regular)
e.Graphics.DrawString(e.Node.Text, font, Brushes.MidnightBlue, New Point(indent + 5, e.Bounds.Location.Y + 5), New StringFormat())
ElseIf e.Node.Level.Equals(1) Then
'action
Dim params = CType(e.Node, ActionNode).Params
Dim x = indent + 5
e.Graphics.DrawString(e.Node.Text, Me.Font, Brushes.Black, New Point(x, e.Bounds.Location.Y + 2), New StringFormat())
For Each param In params
e.Graphics.DrawString(param.Key & ":", Me.Font, Brushes.DarkSlateBlue, New Point(x, e.Node.Bounds.Location.Y + 15))
x += e.Graphics.MeasureString(param.Key & ":", Me.Font).Width - 1
e.Graphics.DrawString(param.Value, Me.Font, Brushes.SlateGray, New Point(x, e.Node.Bounds.Location.Y + 15))
x += e.Graphics.MeasureString(param.Value, Me.Font).Width
Next
ElseIf e.Node.Level.Equals(2) Then
'assertion
Dim params = CType(e.Node, AssertionNode).Params
Dim x = indent + 5
e.Graphics.DrawString(e.Node.Text, Me.Font, Brushes.Black, New Point(x, e.Bounds.Location.Y + 2), New StringFormat())
For Each param In params
e.Graphics.DrawString(param.Key & ":", Me.Font, Brushes.DarkSlateBlue, New Point(x, e.Node.Bounds.Location.Y + 15))
x += e.Graphics.MeasureString(param.Key & ":", Me.Font).Width - 1
e.Graphics.DrawString(param.Value, Me.Font, Brushes.SlateGray, New Point(x, e.Node.Bounds.Location.Y + 15))
x += e.Graphics.MeasureString(param.Value, Me.Font).Width
Next
End If
Catch ex As Exception
End Try
End Sub
Это рисует древовидное представление в точности так, как я хочу, но по какой-то причине, когда вы наводите курсор мыши на открытые / закрывающиеся элементы, узел кажется перерисованным, но поверх его последней перерисовки, в результате чего текст выглядит жирным шрифтом, а контур вокруг изображений. Это происходит, однако, только если узел не выбран, и если он выбран, то все в порядке. Извините, новый пользователь не может опубликовать дамп экрана.
Я не уверен, что вы можете подключиться к событию глифа при наведении мыши, чтобы просто лишить законной силы контроль даже при обнаружении отправителя в событии рисования, но теперь я вне идеалов.
Пробовал:
- Очистка графического объекта при рисовании перед узлом рисования
- Установка фонового прямоугольника и отрисовка узла точно так же, как при выборе