ejemplos c# winforms treeview treenode

c# - ejemplos - treenode java



C#WinForms resalta treenode cuando la vista de árbol no tiene foco (4)

No es una solución absolutamente perfecta, sino bastante cercana:

treeView.HideSelection = false; treeView.DrawMode = TreeViewDrawMode.OwnerDrawText; treeView.DrawNode += (o, e) => { if (!e.Node.TreeView.Focused && e.Node == e.Node.TreeView.SelectedNode) { Font treeFont = e.Node.NodeFont ?? e.Node.TreeView.Font; e.Graphics.FillRectangle(Brushes.Gray, e.Bounds); ControlPaint.DrawFocusRectangle(e.Graphics, e.Bounds, SystemColors.HighlightText, SystemColors.Highlight); TextRenderer.DrawText(e.Graphics, e.Node.Text, treeFont, e.Bounds, SystemColors.HighlightText, TextFormatFlags.GlyphOverhangPadding); } else e.DrawDefault = true; }; treeView.MouseDown += (o, e) => { TreeNode node = treeView.GetNodeAt(e.X, e.Y); if (node != null && node.Bounds.Contains(e.X, e.Y)) treeView.SelectedNode = node; };

Gretings

Estoy haciendo una interfaz para editar escenarios para un juego. Básicamente consiste en eventos, que tienen condiciones y acciones anidadas. Por lo tanto, planeé usar dos vistas de árbol: una para seleccionar el evento y otra para seleccionar la condición / acción dentro del evento para editar.

Ahora, verás, si selecciono un evento (en la vista de árbol a la izquierda) y luego trato de seleccionar algo en la vista de árbol a la derecha, la vista de árbol a la izquierda dejará de mostrar el rectángulo de selección azul. Esto es obviamente malo porque ahora el usuario no sabe qué evento está editando.

La única manera que encontré para retener algún tipo de información sobre cuál es la selección actual es mediante el uso de SelectedImageIndex, pero esa es solo una pequeña imagen que será diferente.

¿Hay alguna otra manera de resaltar el treenode mientras no hay foco en la vista de árbol? Sé que solo puedo usar Graphics.DrawRectangle o algo así, pero escuché que el dibujo debería realizarse en Paint event y treeview no tiene ningún evento de paint ... Así que supongo que si lo dibujo en el evento de perder el enfoque, y luego arrastre el formulario ¿Fuera de la pantalla o algo así, será "borrado"?

De todos modos, dígame si tiene una idea (aparte de usar un ícono separado para treenode seleccionado y no seleccionado)

¡Gracias!


Todavía se muestra, pero solo en gris claro, lo que, dependiendo de su pantalla y la configuración actual, puede estar cerca en visible.

Reemplace el evento OnDrawNode. Así que creas una nueva clase (llámala "SpecialTreeView") y hereda de Microsoft TreeView como la class SpecialTreeView : TreeView . Luego agrega la siguiente anulación de evento:

protected override void OnDrawNode(DrawTreeNodeEventArgs e) { TreeNodeStates treeState = e.State; Font treeFont = e.Node.NodeFont ?? e.Node.TreeView.Font; // Colors. Color foreColor = e.Node.ForeColor; string strDeselectedColor = @"#6B6E77", strSelectedColor = @"#94C7FC"; Color selectedColor = System.Drawing.ColorTranslator.FromHtml(strSelectedColor); Color deselectedColor = System.Drawing.ColorTranslator.FromHtml(strDeselectedColor); // New brush. SolidBrush selectedTreeBrush = new SolidBrush(selectedColor); SolidBrush deselectedTreeBrush = new SolidBrush(deselectedColor); // Set default font color. if (foreColor == Color.Empty) foreColor = e.Node.TreeView.ForeColor; // Draw bounding box and fill. if (e.Node == e.Node.TreeView.SelectedNode) { // Use appropriate brush depending on if the tree has focus. if (this.Focused) { foreColor = SystemColors.HighlightText; e.Graphics.FillRectangle(selectedTreeBrush, e.Bounds); ControlPaint.DrawFocusRectangle(e.Graphics, e.Bounds, foreColor, SystemColors.Highlight); TextRenderer.DrawText(e.Graphics, e.Node.Text, treeFont, e.Bounds, foreColor, TextFormatFlags.GlyphOverhangPadding); } else { foreColor = SystemColors.HighlightText; e.Graphics.FillRectangle(deselectedTreeBrush, e.Bounds); ControlPaint.DrawFocusRectangle(e.Graphics, e.Bounds, foreColor, SystemColors.Highlight); TextRenderer.DrawText(e.Graphics, e.Node.Text, treeFont, e.Bounds, foreColor, TextFormatFlags.GlyphOverhangPadding); } } else { if ((e.State & TreeNodeStates.Hot) == TreeNodeStates.Hot) { e.Graphics.FillRectangle(SystemBrushes.Window, e.Bounds); TextRenderer.DrawText(e.Graphics, e.Node.Text, hotFont, e.Bounds, System.Drawing.Color.Black, TextFormatFlags.GlyphOverhangPadding); } else { e.Graphics.FillRectangle(SystemBrushes.Window, e.Bounds); TextRenderer.DrawText(e.Graphics, e.Node.Text, treeFont, e.Bounds, foreColor, TextFormatFlags.GlyphOverhangPadding); } } }

Compile el código y debería ver "SpecialTreeView" en su caja de herramientas en el diseñador. Reemplace su TreeView con este nuevo con el mismo nombre y lo único que será diferente son los colores de selección. Cuando se selectedColor , se seleccionará deselectedColor , cuando no se seleccione el deselectedColor .

Espero que esto ayude.


Solución rápida:

Establecer las propiedades:

  • HideSelection = false;
  • DrawMode = TreeViewDrawMode.OwnerDrawText;

Luego, en el controlador de eventos DrawNode simplemente haga:

private void treeView1_DrawNode(object sender, DrawTreeNodeEventArgs e) { e.DrawDefault = true; }

En Windwos 7, esto restaura la representación anterior, incluido el cuadro de guiones alrededor de la selección (que en realidad parece un poco desactualizado). El texto será blanco con foco y negro sin foco. El fondo permanece azul y visible.

Esta respuesta no es nueva, las otras también contienen estos pasos, pero este es el mínimo necesario (al menos en Windows 7, no probó otros sistemas operativos).