【问题标题】:How do I set an image for some but not all nodes in a TreeView?如何为 TreeView 中的某些但不是所有节点设置图像?
【发布时间】:2010-09-20 16:07:54
【问题描述】:

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

想要在图片应有的空白处。我想要一个看起来像 TreeView 没有 ImageList 时会绘制的线条的图像。我如何让它为某些项目而不是其他项目绘制图像,而无需求助于那种笨拙的技巧?

【问题讨论】:

  • 你能指定这是在 web 或 winforms 应用程序中使用吗?
  • 接受的答案应该是下面 Aussie Ash 的答案。经过测试,它可以工作。

标签: c# .net winforms treeview


【解决方案1】:

您需要将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

【讨论】:

  • MS 是否在某处记录了这一点?我会谨慎使用这种技术,因为这听起来像是在未来版本的框架中可能不兼容的东西。
  • 不可见节点不是很有用。如果有文字,您会看到图像的空间仍然保留,无论是否为空白。
【解决方案2】:

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

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

【讨论】:

  • 我不认为你在某个地方有这张图片,是吗? :-)
  • 截屏并修改以适合您的目的
  • 这就是我最终做的,只是懒惰,以防你有一个躺在身边:-)
  • 为了将来参考,我做了一个带有说明和图片(16x16)的小GitHub项目:github.com/cmbankester/tree-view-no-image-dots/blob/master/…
【解决方案3】:

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

【讨论】:

  • 好像限制为14张图片。
【解决方案4】:

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

如果您尝试将 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

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

【讨论】:

  • 那是因为 treeView.ImageIndex 设置器包含这个(我使用 ILSpy): if (value == -1)value = 0;if (value
  • 只需包含一个空白的 1 像素 x 1 像素图标,然后加载不需要图标的节点。
【解决方案5】:

这会将TreeNode 文本绘制到图像应该在的位置,从而消除空白。

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

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

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

【讨论】:

  • 不太好用。选择仍然在其原始位置绘制(相对于没有图像的节点向右错位)。
  • 你的回答对我有帮助,但我整理了逻辑。您需要操纵 Bounds.Left 来隐藏空格。
【解决方案6】:

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

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

所以,索引 0 是一个空图像。 我希望这会有所帮助

【讨论】:

  • 这个方法留下了一个空白,与原发帖人要求的相反。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-06
  • 1970-01-01
  • 2011-06-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多