22

我有一个带有 的TreeViewwindows 窗体控件ImageList,我希望一些节点显示图像,但其他节点没有图像。

想要图像应该存在的空白区域。如果没有 ImageList,我不想要一个看起来像 TreeView 将绘制的线条的图像。我如何让它为某些项目而不是其他项目绘制图像,而不需要像这样笨拙的黑客?

4

6 回答 6

12

您需要将ImageIndex和设置SelectedImageIndex为一个高于ImageList. 例如,如果您创建此节点并将其添加到您的TreeView

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

你会在TreeNode你的TreeView. 我改变了我的背景颜色,TreeView它仍然是不可见的。

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

于 2009-06-17T20:55:48.977 回答
11

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

带有图像点的 TreeNode

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

于 2013-12-16T16:49:59.477 回答
9

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

于 2015-07-20T01:55:29.527 回答
8

我试过一次,我认为这是不可能的。

如果您尝试同时设置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

这种方式告诉您,控件开发人员希望确保始终存在默认图像。恐怕这只会给你留下黑客选项。

于 2008-11-04T16:36:21.053 回答
3

这将在图像应该出现的位置绘制TreeNode文本,摆脱空白。

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

接下来,当您添加一个节点时,将其设置为ImageIndex大于SelectedImageIndex您的值的yourImageListName.Images.Count值。这样就不会绘制任何图像,但仍然会有你不想要的空白。

现在摆脱空白。为 treeviewsDrawNode事件添加句柄。这可以通过转到树视图属性面板并单击面板中看起来像一个闪电的图标来完成,然后滚动直到看到文本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);
于 2013-02-03T02:47:08.560 回答
0

嘿兄弟,我找到了方法。将第一张图片设置为空图片,像这样...

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

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

于 2015-07-09T19:43:06.977 回答