C# 如何为树状视图中的一些但不是所有节点设置映像?

C# 如何为树状视图中的一些但不是所有节点设置映像?,c#,.net,winforms,treeview,C#,.net,Winforms,Treeview,我有一个TreeViewwindows窗体控件,带有ImageList,我希望一些节点显示图像,但其他节点没有图像 我不想在图像应该在的地方留下空白。我不希望图像看起来像树视图在没有ImageList的情况下绘制的线条。我如何才能让它为某些项目而不是其他项目绘制图像,而不使用像那样笨拙的黑客手段?我试过一次,我认为这是不可能的 如果尝试将ImageKey和ImageIndex都设置为“未设置”值,则控件将默认值ImageIndex设置为0。以下代码: treeView.ImageKey = "V

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


我不想在图像应该在的地方留下空白。我不希望图像看起来像树视图在没有ImageList的情况下绘制的线条。我如何才能让它为某些项目而不是其他项目绘制图像,而不使用像那样笨拙的黑客手段?

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

如果尝试将
ImageKey
ImageIndex
都设置为“未设置”值,则控件将默认值
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

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

您需要将
ImageIndex
SelectedImageIndex
设置为高于
ImageList
中的数值。例如,如果创建此节点并将其添加到
树视图中

TreeNode node1 = new TreeNode(string.Empty, 12, 12); // imageList1.Count = 5
您将在
TreeView
中插入一个不可见的
TreeNode
。我更改了我的
树视图的背景色,但它仍然不可见


(我在谷歌上搜索了一段时间,最终在这里找到了答案:)

这将在图像应该出现的位置绘制
树节点
文本,消除空白。

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

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

现在来清除空白。为TreeView
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
节点使用点的图像

我将此图像添加为列表中的最后一个图像,如果项目不应该有图像,我将其设置为
ImageList.Images.Count-1
Hei bro,我找到了一种方法。 将第一个图像设置为空图像,如下所示

TreeView treeView = new TreeView();
treeView.ImageList.Images.Add(new Bitmap(1,1));
因此,索引0是一个空图像。
我希望这会有所帮助

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

请指定这是否用于web或winforms应用程序?接受的答案应该是Aussie Ash给出的,如下所示。这是因为treeView.ImageIndex setter包含以下内容(我使用了ILSpy):if(value=-1)value=0;如果(值<0)抛出新ArgumentOutOfRangeException(“ImageIndex”,SR.GetString(“InvalidLowBoundArgumentEx”,新对象[]{“ImageIndex”,value.ToString(CultureInfo.CurrentCulture),0.ToString(CultureInfo.CurrentCulture)})。。。。只需包含一个空白的1像素x 1像素图标,并加载您不需要图标的节点,就可以了。这是MS在什么地方记录的吗?我会谨慎地使用这种技术,因为它听起来像是在框架的未来版本中可能无法保持兼容的东西。如果有文本,你会看到图像的空间仍然是保留的,不管是否为空。不太有效。选择仍然绘制在它的原始位置上(相对于没有图像的节点向右错位)。你的回答帮助了我,但我整理了逻辑。它只是
边界。左
,您需要对其进行操作以隐藏空白。我想您不会在某个地方有此图像吧?:-)拍摄一个屏幕截图并修改它以适应您的目的这就是我最终要做的,只是为了偷懒,以防您身边有一张照片:-)作为将来的参考,我制作了一个带有说明和图像(16x16)的小GitHub项目来实现这一点:它似乎仅限于14张图像。这种方法留下了一个空白,与原始海报的要求相反。