如何为TreeView中的某些节点而不是所有节点设置图像?

我有一个带有ImageListTreeView窗体控件,我想要一些节点来显示图像,但其他节点没有图像。

希望图像应该是空白区域。 我希望图像看起来像TreeView在没有ImageList时会绘制的线条。 如何在不诉诸这种笨拙的黑客的情况下,为某些项目而不是其他项目绘制图像?

我尝试了一次,我认为不可能。

如果您尝试将ImageKeyImageIndex都设置为“未设置”值,则控件只将ImageIndex默认为0.以下代码:

 treeView.ImageKey = "Value"; Debug.WriteLine(treeView.ImageIndex); treeView.ImageKey = null; Debug.WriteLine(treeView.ImageIndex); treeView.ImageIndex = -1; Debug.WriteLine(treeView.ImageIndex); 

产生输出:

 -1 0 0 

这种方式告诉您控件开发人员希望确保始终存在默认图像。 这只是让你害怕的黑客选择。

您需要将ImageIndexSelectedImageIndex设置为一个高于ImageList中值的数字。 例如,如果您创建此节点并将其添加到TreeView

 TreeNode node1 = new TreeNode(string.Empty, 12, 12); // imageList1.Count = 5 

您将在TreeView插入一个不可见的TreeNode 。 我改变了TreeView的背景颜色,它仍然是隐形的。

(我用谷歌搜索了一段时间,最终我找到了答案: http : //www.tech-archive.net/Archive/DotNet/microsoft.public.dotnet.framework.windowsforms/2006-09/msg00322.html )

我选择做的是为那些不应该有图像的TreeView节点使用点图像。

带有图像点的TreeNode

我将此图像添加为列表中的最后一个图像,如果该项目不应该有图像,我将其设置为ImageList.Images.Count-1

我发现在TreeView上使用StateImageList而不是ImageList只会在TreeNode上的StateImageIndex等于或大于0时显示图像

这将绘制图像应该已经存在的TreeNode文本,摆脱空白区域。

您需要将TreeViewDrawMode属性设置为OwnerDrawText 。 您可以在属性面板中找到DrawMode属性。

接下来,添加节点时,将其ImageIndexSelectedImageIndex设置为大于yourImageListName.Images.Count值的值。 这样就不会绘制图像,但仍然会有你不想要的空白区域。

现在要摆脱白色空间。 为treeviews DrawNode事件添加句柄。 这可以通过转到treeviews属性面板并单击面板中看起来像灯光螺栓的图标来完成,然后滚动直到看到文本DrawNode ,双击它。

现在,您只需将其复制并粘贴到创建的方法中即可

 if (e.Node.ImageIndex >= e.Node.TreeView.ImageList.Images.Count) // if there is no image { int imagewidths = e.Node.TreeView.ImageList.ImageSize.Width; int textheight = TextRenderer.MeasureText(e.Node.Text, e.Node.NodeFont).Height; int x = e.Node.Bounds.Left - 3 - imagewidths / 2; int y = (e.Bounds.Top + e.Bounds.Bottom) / 2+1; Point point = new Point(x - imagewidths/2, y - textheight/2); // the new location for the text to be drawn TextRenderer.DrawText(e.Graphics, e.Node.Text, e.Node.NodeFont, point, e.Node.ForeColor); } else // drawn at the default location TextRenderer.DrawText(e.Graphics, e.Node.Text, e.Node.TreeView.Font, e.Bounds, e.Node.ForeColor); 

嘿兄弟,我找到了办法。 将第一个图像设置为空图像,如下所示……

 TreeView treeView = new TreeView(); treeView.ImageList.Images.Add(new Bitmap(1,1)); 

因此,索引0是空图像。 我希望这有帮助