27

Вопрос по treeview, c# – C # WinForms выделяет триод, когда у дерева нет фокуса

Gretings.

Я создаю интерфейс для редактирования сценариев игры. В основном это состоит из событий, которые имеют вложенные условия и действия. Итак, я планировал использовать два дерева - одно для выбора события, а другое для выбора условия / действия внутри события для редактирования.

Теперь, вы видите, если я выберу событие (в левом дереве), а затем попробую выбрать что-то в правом дереве, левое дерево перестанет показывать синий прямоугольник выбора. Это, очевидно, плохо, потому что теперь пользователь не знает, какое событие он редактирует!

Единственный способ сохранить некоторую информацию о текущем выделении - использовать SelectedImageIndex, но это только одно маленькое изображение, которое будет другим.

Есть ли какой-либо другой способ выделить триод, когда нет фокусировки на дереве? Я знаю, что могу просто Graphics.DrawRectangle или что-то в этом роде, но я слышал, что рисование должно быть выполнено в событии Paint, а в дереве нет события рисования ... Так что я думаю, если я нарисую его в случае потери фокуса, а затем перетащу форму из экрана или чего-то еще он будет «стерт»?

В любом случае, скажите, пожалуйста, если у вас есть идея (кроме использования отдельного значка для выбранного и не выбранного триода)

Спасибо!

  • Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceeded

    от Istrebitel
  • Error: User Rate Limit Exceeded

    от Istrebitel
  • фактически в Windows7 с цветовой схемой по умолчанию это не помогает - когда древовидная структура теряет фокус, выбранный узел выглядит как невыбранный, и я не вижу разницы с другими узлами.

    от
  • Мне нравится, за исключением двух проблем: 1) значок флажка обрезается с правой стороны, и 2) он кажется значительно медленнее при проверке / снятии флажка ....

    от
  • Ах да, нашел это. Его DrawMode, если он установлен в Normal, событие не сработает.

    от Istrebitel
  • отправленное вами изображение исчезло. у вас есть где-нибудь копия? Тем временем я удалю ссылку.

    от Lonely Neuron
  • 8

    Не совсем идеальное решение, но совсем рядом:

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

  • 9

    Fast solution:

    Установите свойства:

    HideSelection = false; DrawMode = TreeViewDrawMode.OwnerDrawText;

    Затем в обработчике DrawNode просто выполните:

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

    В Windwos 7 это восстанавливает старый рендеринг, включая пунктирную рамку вокруг выделения (которая на самом деле выглядит немного устаревшей). Текст будет белым с фокусом и черным без фокуса. Фон остается синим и видимым.

    Этот ответ не является новым, другие также содержат эти шаги, но это минимально необходимый (по крайней мере, в Windows 7 не тестировал другие ОС).

  • 16

    Он по-прежнему отображается

    но только светло-серым цветом, который в зависимости от вашего экрана и текущей настройки может быть почти видимым!

    Переопределите событие OnDrawNode. Таким образом, вы создаете и новый класс (назовите его «SpecialTreeView») наследником от MicrosoftTreeView лайкclass SpecialTreeView : TreeView, Затем вы добавляете следующее переопределение события:

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

    Скомпилируйте код, и вы должны увидеть & quot; SpecialTreeView & quot; в вашем ящике для инструментов в конструкторе. Замените ваш TreeView на новый, используя то же имя, и единственное, что будет отличаться, это выбор цветов. При выборе это будетselectedColorкогда не выбранdeselectedColor.

    Надеюсь, это поможет.

  • 56

    То, что вы ищете, это

    HideSelection собственность наTreeView.

    From MSDN:

    Gets or sets a value indicating whether the selected tree node remains highlighted even when the tree view has lost the focus.

    Ссылка на сайт:http://msdn.microsoft.com/en-us/library/system.windows.forms.treeview.hideselection.aspx

    Code:

    TreeView.HideSelection = false;