C # WinForms met treenode en surbrillance lorsque treeview n'a pas de focus

Gretings.

je fais une interface pour éditer des scénarios pour un jeu. Il se compose essentiellement d'événements, qui ont imbriqué des conditions et des actions. Donc, j'ai prévu d'utiliser deux treeviews - un pour sélectionner l'événement, et l'autre pour sélectionner la condition/action à l'intérieur de l'événement à éditer.

Maintenant, vous voyez, si je sélectionne un événement (dans treeview gauche) et puis j'essaie de sélectionner quelque chose dans treeview droite, la treeview gauche cessera d'afficher le rectangle de sélection bleu. C'est évidemment mauvais parce que maintenant l'utilisateur ne sait pas quel événement il édite!

la seule façon que j'ai trouvée pour conserver une sorte d'information sur ce qu'est la sélection actuelle est en utilisant SelectedImageIndex, mais ce n'est qu'une petite image qui sera différente.

y a-t-il une autre façon de mettre en évidence le treenode alors qu'il n'y a pas de focus sur le treeview? Je sais que je peux juste des Graphiques.DrawRectangle ou quelque chose, mais j'ai entendu que le dessin devrait être fait dans la peinture événement et treeview n'a pas d'événement de peinture... Donc je suppose que si je dessine sur le cas de perdre la mise au point, et puis traîner le formulaire hors de l'écran ou quelque chose, il sera "effacé"?

en tout cas, s'il vous plaît dites-moi si vous avez une idée (autre que d'utiliser une icône séparée pour treenode sélectionné et non sélectionné)

Merci!

25
demandé sur Lonely Neuron 2012-04-05 23:22:01

4 réponses

ce que vous cherchez est le HideSelection propriété sur l' TreeView.

From MSDN:

Obtient ou définit une valeur indiquant si le noeud d'arbre sélectionné reste en surbrillance même lorsque la vue d'arbre a perdu la mise au point.

Lien: http://msdn.microsoft.com/en-us/library/system.windows.forms.treeview.hideselection.aspx

Code:

TreeView.HideSelection = false;
51
répondu aKzenT 2012-04-05 19:26:06

il est toujours affiché mais seulement en gris clair qui peut être visible en fonction de votre écran et de la configuration actuelle!

annulation de L'événement OnDrawNode. Ainsi, vous créez et la nouvelle classe (appelez-la "Specialtreview") un héritage de Microsoft TreeViewclass SpecialTreeView : TreeView. Ensuite, vous ajoutez l'événement suivant remplacer:

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);
        }
    }
}

compilez le code et vous devriez voir "Specialtreview" dans votre boîte à outils dans le concepteur. Remplacez votre TreeView par ce nouveau en utilisant le même nom et la seule chose qui sera différente est la sélection des couleurs. Lorsque sélectionné, il sera selectedColor, lorsqu'il n'est pas sélectionné l' deselectedColor.

j'espère que cette aide.

16
répondu MoonKnight 2014-04-07 07:20:59

solution rapide:

Définir les propriétés:

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

puis dans le gestionnaire D'événements DrawNode faites simplement:

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

sur Windwos 7 cela restaure l'ancien Rendu, y compris la boîte tiretée autour de la sélection (qui semble en fait un peu dépassée). Le texte sera blanc avec un accent, et noir sans accent. Le fond reste bleu et visible.

Cette réponse n'est pas nouveau, les autres contiennent également ces étapes, mais c'est le minimum nécessaire (au moins dans Windows 7, n'a pas testé d'autres OS).

9
répondu Louis Somers 2015-12-22 00:50:28

pas absolument solution parfaite, mais tout près:

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;
};
8
répondu Bachor 2014-10-09 12:50:24