2008-11-04 15 views
19

Tengo un control de formularios de Windows TreeView con un ImageList, y quiero que algunos de los nodos muestren imágenes, pero los otros no tienen imágenes.¿Cómo configuro una imagen para algunos nodos, pero no para todos, en un TreeView?

I no desea quiere un espacio en blanco donde debería estar la imagen. I no desea querer una imagen que se parece a las líneas que dibujaría TreeView si no tuviera una ImageList. ¿Cómo hago para dibujar imágenes de algunos elementos y no de otros, sin recurrir a hackers torpes como ese?

+0

¿Podría especificar si se utiliza en una web o la aplicación winforms, por favor? – splattne

+0

Hecho - winforms. – Simon

Respuesta

7

Probé esto una vez y no creo que sea posible.

Si se intenta establecer tanto ImageKey y ImageIndex a "no ajustada" valores por defecto sólo el control ImageIndex a 0. El siguiente código:

treeView.ImageKey = "Value"; 
Debug.WriteLine(treeView.ImageIndex); 
treeView.ImageKey = null; 
Debug.WriteLine(treeView.ImageIndex); 
treeView.ImageIndex = -1; 
Debug.WriteLine(treeView.ImageIndex); 

produce una salida:

-1 
0 
0 

Esta clase de le dice que los desarrolladores de control querían asegurarse de que siempre haya una imagen predeterminada. Eso me deja con las opciones de pirateo, me temo.

+1

Eso es porque el setter treeView.ImageIndex contiene esto (yo usé ILSpy): if (value == -1) value = 0; if (value <0) throw new ArgumentOutOfRangeException ("ImageIndex", SR.GetString ("InvalidLowBoundArgumentEx", nuevo objeto [] {"ImageIndex", value.ToString (CultureInfo.CurrentCulture), 0.ToString (CultureInfo.CurrentCulture)})); .... – toong

+0

Simplemente incluya un ícono en blanco de 1 píxel x 1 píxel y cargue los nodos que no desea un ícono, con esto. –

12

Debe establecer ImageIndex y SelectedImageIndex en un número que sea mayor que el número de valores en su ImageList. Por ejemplo, si se crea este nodo y añadirlo a su TreeView:

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

que tendrá un invisible TreeNode inserta en su TreeView. Cambié el color de fondo de mi TreeView y seguía invisible.

(Googled esto durante algún tiempo, y al final encontré la respuesta aquí: http://www.tech-archive.net/Archive/DotNet/microsoft.public.dotnet.framework.windowsforms/2006-09/msg00322.html)

+2

¿Está esto documentado por MS en alguna parte? Sería cauteloso con este tipo de técnica, ya que parece ser el tipo de cosa que no se puede mantener compatible en futuras versiones del marco. –

+1

Los nodos invisibles no son muy útiles. Si hay texto, verá que el espacio para la imagen aún está reservado, en blanco o no. –

+0

Creo que esta debería ser la respuesta aceptada :) –

2

Para ello se utilizará el texto TreeNode donde la imagen debería haber sido, deshacerse de los espacios en blanco.

Deberá establecer la propiedad DrawMode de TreeView en OwnerDrawText. Puede encontrar la propiedad DrawMode en el panel de propiedades.

A continuación, cuando agrega un nodo, establezca que es ImageIndex y SelectedImageIndex mayor que el valor de su yourImageListName.Images.Count valor. Esto es para que no se dibuje ninguna imagen, pero aún habrá espacio en blanco que no desea.

Ahora para deshacerse del espacio en blanco. Agregue un controlador para el evento treeviews DrawNode. Esto se puede hacer yendo al panel de propiedades de TreeView y haciendo clic en el icono del panel que se parece a un perno de iluminación, luego desplácese hasta que vea el texto DrawNode, haga doble clic en él.

Ahora sólo copiar y pegar esto en el método creado

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); 
+0

No funciona del todo. La selección todavía se dibuja en su ubicación original (dislocada a la derecha relativa a los nodos sin imágenes). –

+0

Tu respuesta me ayudó, pero limité la lógica. Es solo 'Bounds.Left' que necesita manipular para ocultar el espacio en blanco. –

9

Lo que he elegido hacer es utilizar una imagen de puntos para aquellos TreeView nodos que no se supone que tienen una imagen.

TreeNode with image dots

agrego esta imagen como la última imagen de la lista, y si no se supone que el elemento a tener una imagen lo fijo a ImageList.Images.Count-1

+0

Supongo que no tienes esta imagen, ¿cierto? :-) –

+1

Tome una captura de pantalla y modifíquela para adaptarla a su propósito – MtnManChris

+0

Eso es lo que terminé haciendo, estaba siendo flojo en caso de que tuviera uno por ahí :-) –

1

Hei bro, he encontrado una manera. Establecer la primera imagen como una imagen vacía, así ...

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

Así, el índice 0 es una imagen vacía. espero que esto ayude a

2

He encontrado que el uso de StateImageList en el TreeView en lugar de ImageList sólo se mostrará la imagen cuando StateImageIndex en el TreeNode es igual o mayor que 0

+0

esto parece funcionar perfectamente bien. –

Cuestiones relacionadas