Подтвердить что ты не робот

Как установить изображение для некоторых, но не всех узлов в TreeView?

У меня есть элемент управления

TreeView с ImageList, и я хочу, чтобы некоторые из узлов отображали изображения, а другие не имели изображений.

Мне не нужно пустое место, где должно быть изображение. Я не хочу, чтобы изображение выглядело как линии, которые TreeView рисовал, если у него не было ImageList. Как мне получить изображение для некоторых предметов, а не других, не прибегая к таким неуклюжим хакам?

4b9b3361

Ответ 1

Я попробовал это один раз, и я не думаю, что это возможно.

Если вы попытаетесь установить значения 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

Этот тип говорит вам, что разработчики управления хотели удостовериться, что всегда было изображение по умолчанию. Я просто боюсь, что у вас будут проблемы с взломом.

Ответ 2

Вам нужно установить ImageIndex и SelectedImageIndex на число, которое больше, чем количество значений в ImageList. Например, если вы создадите этот node и добавьте его в свой 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)

Ответ 3

То, что я решил сделать, - использовать изображение точек для тех узлов TreeView, у которых не должно быть изображения.

TreeNode with image dots

Я добавляю это изображение в качестве последнего изображения в списке, и если элемент не должен иметь изображение, я устанавливаю его в ImageList.Images.Count-1

Ответ 4

Это будет рисовать текст TreeNode, где должно было быть изображение, избавляясь от пробела.

Вам нужно установить для свойства TreeView DrawMode значение OwnerDrawText. Свойство DrawMode можно найти на панели свойств.

Затем, добавив node, установите ImageIndex и SelectedImageIndex больше значения вашего значения 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);

Ответ 5

Я обнаружил, что использование StateImageList в TreeView вместо ImageList будет показывать только изображение, когда StateImageIndex на TreeNode равно или больше 0

Ответ 6

Привет, брат, я нашел способ. Установите первое изображение в виде пустого изображения, например...

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

Итак, индекс 0 является пустым изображением. Надеюсь, это поможет