.net Treeview提升drawnode,但某些更改不会传播到屏幕
我正在使用VB中的树视图,以OwnerDrawText作为我的绘图模式。我已经在我的树状视图中处理了Me.DrawNode,以允许我突出显示特定的项目,即突出显示最后一个节点,以此类推。我看到drawnode被调用,并尝试将所有背景设置为自定义颜色.net Treeview提升drawnode,但某些更改不会传播到屏幕,.net,vb.net,winforms,graphics,treeview,.net,Vb.net,Winforms,Graphics,Treeview,我正在使用VB中的树视图,以OwnerDrawText作为我的绘图模式。我已经在我的树状视图中处理了Me.DrawNode,以允许我突出显示特定的项目,即突出显示最后一个节点,以此类推。我看到drawnode被调用,并尝试将所有背景设置为自定义颜色 Public Class Form1 Private nodelist As New List(Of TreeNode) Public Sub New() InitializeComponent()
Public Class Form1
Private nodelist As New List(Of TreeNode)
Public Sub New()
InitializeComponent()
TreeView1.Nodes.AddRange(New TreeNode() {
New TreeNode("Text of Node 0") With {.Name = "Node0"},
New TreeNode("Text of Node 1") With {.Name = "Node1"},
New TreeNode("Text of Node 2") With {.Name = "Node2"},
New TreeNode("Text of Node 3") With {.Name = "Node3"},
New TreeNode("Text of Node 4") With {.Name = "Node4"}
})
End Sub
Private Sub myTreeView_DrawNode(ByVal sender As Object, ByVal e As DrawTreeNodeEventArgs) Handles TreeView1.DrawNode
Console.WriteLine(e.Node.Text & " Rewritten")
' Draw the background and node text for a selected node.
If nodelist.Contains(e.Node) Then
e.Graphics.FillRectangle(New SolidBrush(Color.Chartreuse), e.Bounds)
TextRenderer.DrawText(e.Graphics, e.Node.Text, e.Node.NodeFont, e.Bounds,
Color.Black, Color.Empty,
TextFormatFlags.VerticalCenter)
Else
e.Graphics.FillRectangle(New SolidBrush(Color.Black), e.Bounds)
TextRenderer.DrawText(e.Graphics, e.Node.Text, e.Node.NodeFont, e.Bounds,
Color.White, Color.Empty,
TextFormatFlags.VerticalCenter)
End If
End Sub
Private Sub myTreeView_MouseDown(ByVal sender As Object, ByVal e As MouseEventArgs) Handles TreeView1.MouseDown
Console.WriteLine("Clicked")
Dim clickedNode As TreeNode = TreeView1.GetNodeAt(e.X, e.Y)
nodelist.Add(clickedNode)
If nodelist.Count > 3 Then
nodelist.RemoveAt(0)
End If
TreeView1.SelectedNode = clickedNode
End Sub
End Class
此代码应高亮显示最后三个选定节点。但是,如果单击从0到5的所有节点,您将看到它高亮显示所有内容。然后,如果选择节点2,您将看到所有节点都被重新绘制Console.WriteLine显示了这一点,我认为这意味着节点1和2应该失去高亮颜色,但它们没有。绘图部分是正确的,尽管可以简化:相同的方法可用于背景和文本渲染,把代码升级 MouseDown事件中的逻辑需要进行部分重构,因此被选中和未被选中的节点实际上会从节点集合nodelist字段中添加和删除 TreeView还需要通知更改,调用其方法,以便控件可以重新绘制新的节点选择。在本例中,Invalidate会导致控件重新绘制自身,提升其绘制或类似的相关事件:DrawNode事件
Private Sub TreeView1_DrawNode(sender As Object, e As DrawTreeNodeEventArgs) Handles TreeView1.DrawNode
Console.WriteLine(e.Node.Text & " Rewritten")
Dim backColor As Color = Color.Black
Dim foreColor As Color = Color.White
If nodelist.Contains(e.Node) Then
backColor = Color.Chartreuse
foreColor = Color.Black
End If
e.Graphics.FillRectangle(New SolidBrush(backColor), e.Node.Bounds)
TextRenderer.DrawText(e.Graphics, e.Node.Text, e.Node.NodeFont, e.Node.Bounds,
foreColor, Color.Transparent, TextFormatFlags.VerticalCenter)
End Sub
简化绘图方法:
► 注意:这里,我使用e.Node.Bounds作为节点背景和文本的边框。e、 如果矩形在实际实现中看起来太紧,则可以使用边界。在这种情况下,要进行测试,可将其视为优先事项
Private Sub TreeView1_DrawNode(sender As Object, e As DrawTreeNodeEventArgs) Handles TreeView1.DrawNode
Console.WriteLine(e.Node.Text & " Rewritten")
Dim backColor As Color = Color.Black
Dim foreColor As Color = Color.White
If nodelist.Contains(e.Node) Then
backColor = Color.Chartreuse
foreColor = Color.Black
End If
e.Graphics.FillRectangle(New SolidBrush(backColor), e.Node.Bounds)
TextRenderer.DrawText(e.Graphics, e.Node.Text, e.Node.NodeFont, e.Node.Bounds,
foreColor, Color.Transparent, TextFormatFlags.VerticalCenter)
End Sub
MouseDown事件会将当前选定的节点添加到nodelist集合(如果该节点尚未存在),否则将从集合中删除该节点。
在将所选节点添加到集合之前,验证了另一个条件:集合不能包含超过4个项目;如果集合已满,则不会添加选定的节点
Private Sub myTreeView_MouseDown(ByVal sender As Object, ByVal e As MouseEventArgs) Handles TreeView1.MouseDown
Dim clickedNode As TreeNode = TreeView1.GetNodeAt(e.X, e.Y)
If nodelist.Contains(clickedNode) Then
nodelist.Remove(clickedNode)
Else
If nodelist.Count < 4 Then
nodelist.Add(clickedNode)
TreeView1.SelectedNode = clickedNode
End If
End If
TreeView1.Invalidate()
End Sub
绘图部分是正确的,即使它可以简化:同样的方法可以用于背景和文本渲染,以增加代码 MouseDown事件中的逻辑需要进行部分重构,因此被选中和未被选中的节点实际上会从节点集合nodelist字段中添加和删除 TreeView还需要通知更改,调用其方法,以便控件可以重新绘制新的节点选择。在本例中,Invalidate会导致控件重新绘制自身,提升其绘制或类似的相关事件:DrawNode事件
Private Sub TreeView1_DrawNode(sender As Object, e As DrawTreeNodeEventArgs) Handles TreeView1.DrawNode
Console.WriteLine(e.Node.Text & " Rewritten")
Dim backColor As Color = Color.Black
Dim foreColor As Color = Color.White
If nodelist.Contains(e.Node) Then
backColor = Color.Chartreuse
foreColor = Color.Black
End If
e.Graphics.FillRectangle(New SolidBrush(backColor), e.Node.Bounds)
TextRenderer.DrawText(e.Graphics, e.Node.Text, e.Node.NodeFont, e.Node.Bounds,
foreColor, Color.Transparent, TextFormatFlags.VerticalCenter)
End Sub
简化绘图方法:
► 注意:这里,我使用e.Node.Bounds作为节点背景和文本的边框。e、 如果矩形在实际实现中看起来太紧,则可以使用边界。在这种情况下,要进行测试,可将其视为优先事项
Private Sub TreeView1_DrawNode(sender As Object, e As DrawTreeNodeEventArgs) Handles TreeView1.DrawNode
Console.WriteLine(e.Node.Text & " Rewritten")
Dim backColor As Color = Color.Black
Dim foreColor As Color = Color.White
If nodelist.Contains(e.Node) Then
backColor = Color.Chartreuse
foreColor = Color.Black
End If
e.Graphics.FillRectangle(New SolidBrush(backColor), e.Node.Bounds)
TextRenderer.DrawText(e.Graphics, e.Node.Text, e.Node.NodeFont, e.Node.Bounds,
foreColor, Color.Transparent, TextFormatFlags.VerticalCenter)
End Sub
MouseDown事件会将当前选定的节点添加到nodelist集合(如果该节点尚未存在),否则将从集合中删除该节点。
在将所选节点添加到集合之前,验证了另一个条件:集合不能包含超过4个项目;如果集合已满,则不会添加选定的节点
Private Sub myTreeView_MouseDown(ByVal sender As Object, ByVal e As MouseEventArgs) Handles TreeView1.MouseDown
Dim clickedNode As TreeNode = TreeView1.GetNodeAt(e.X, e.Y)
If nodelist.Contains(clickedNode) Then
nodelist.Remove(clickedNode)
Else
If nodelist.Count < 4 Then
nodelist.Add(clickedNode)
TreeView1.SelectedNode = clickedNode
End If
End If
TreeView1.Invalidate()
End Sub
我已经用你在PasteBin中发布的代码更新了你的OP。下次,在这里添加你的代码。我已经用你在PasteBin中发布的代码更新了你的OP。下次,在这里添加您的代码。感谢Jimi的回复,因为这将修复它。感谢Jimi的回复,因为这将修复它。