Как установить изображение для некоторых, но не всех узлов в TreeView?
У меня есть элемент управления
TreeView
с
ImageList
, и я хочу, чтобы некоторые из узлов отображали изображения, а другие не имели изображений.
Мне не нужно пустое место, где должно быть изображение. Я не хочу, чтобы изображение выглядело как линии, которые TreeView рисовал, если у него не было ImageList. Как мне получить изображение для некоторых предметов, а не других, не прибегая к таким неуклюжим хакам?
Ответы
Ответ 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 является пустым изображением.
Надеюсь, это поможет