Владелец TreeView Draw Anomaly - PullRequest
0 голосов
/ 12 июня 2018

Я использую Microsoft Visual Studio Community 2017 версии 15.7.2 и .NET Framework версии 4.7.03056.

Я использую Winforms TreeView и изменяю его поведение по умолчанию, чтобы сделать его немногонемного больше похоже на древовидную структуру Windows Explorer.Я установил следующие свойства:

LineHeight`    22
DrawMode       OwnerDrawAll

Я использую следующее для события DrawNode.В этом коде используются растровые изображения в правой и нижней скобках (16x16) для отображения развернутых или нерасширенных узлов, а также используются настраиваемые цвета для выделения / выделения фокуса.Ничего экзотического.

private void treeDir_DrawNode(object sender, DrawTreeNodeEventArgs e)
{
    const int indent = 12;
    const int markerSpacing = 20;

    int leftPos = e.Bounds.Left + e.Node.Level * indent;
    Brush selectBrush;
    Pen pen;
    Graphics g = e.Graphics;

    e.DrawDefault = false;

    if (e.Node.IsSelected)
    {
        if (e.Node.TreeView.Focused)
        {
            selectBrush = new SolidBrush(FocusedBackgroundColor);
            pen = new Pen(new SolidBrush(FocusedPenColor));
        }
        else
        {
            selectBrush = new SolidBrush(UnfocusedBackgroundColor);
            pen = new Pen(new SolidBrush(UnfocusedPenColor));
        }

        g.FillRectangle(selectBrush, e.Bounds);
        g.DrawRectangle(pen, e.Bounds);
    }

    if (e.Node.Nodes.Count > 0)
    {
        if (e.Node.IsExpanded)
        {
            g.DrawImage(Properties.Resources.Expanded, leftPos+2, e.Bounds.Top+2);
        }
        else
        {
            g.DrawImage(Properties.Resources.Unexpanded, leftPos+2, e.Bounds.Top+2);
        }
    }

    g.DrawString(
        e.Node.Text, CommonFont, new SolidBrush(Color.Black), leftPos + markerSpacing, e.Bounds.Top+2);
}

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

При запуске формы:

enter image description here

Затем я дважды щелкаю Узел 4:

enter image description here

Если дважды щелкнуть первый узел, проблема исчезнет:

enter image description here

С этого момента, если я дважды щелкну Узел 4, проблема больше не возникает.Двойной щелчок по первому узлу устраняет проблему и позволяет избежать ее в течение срока службы формы после этой точки для узла 4. Однако, если я дважды щелкну другой расширяемый узел ниже, это произойдет снова.

Этоошибка в TreeView или я что-то не так делаю в розыгрыше моего владельца?

1 Ответ

0 голосов
/ 12 июня 2018

Событие DrawNode вызывается слишком часто при двойном щелчке, и один набор вызовов имеет прямоугольник границ, равный Empty.

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

Таким образом, в качестве обходного пути вы можете ярлык событие DrawNode для всех неправильныхвызовы в начале события:

if (e.Bounds.Height < 1 || e.Bounds.Width < 1) return;

Я также рекомендую рендеринг текста следующим образом ..:

TextRenderer.DrawText(g, e.Node.Text, CommonFont, 
                      new Point( leftPos + markerSpacing, e.Bounds.Top+2), Color.Black);

TextRenderer всегда рекомендуется более Graphics.DrawString дляформы, поскольку это улучшает несколько недостатков.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...