Problem mit TreeView.DrawNode - OwnerDrawText

Habe ich eine app, die Verbindung zu einem remote-server und Abfragen von Daten, wenn nötig. Es hat ein TreeView, wo die Knoten repräsentieren Objekte, die verfügbar sind und die Farbe des Textes angeben, ob die Daten geladen wurden oder nicht; Grau-Kursiv gibt nicht geladen, schwarz, normaler text geladen wird.

Derzeit habe ich die TreeView werden OwnderDrawText und der TreeView.DrawNode-Funktion ziehen Sie einfach den text etwa so:

private void TreeViewDrawNode(object sender, DrawTreeNodeEventArgs e)
{
    if (!e.Node.IsVisible)
    {
        return;
    }

    bool bLoaded = false;

    if (e.Bounds.Location.X >= 0 && e.Bounds.Location.Y >= 0)
    {
       if(e.Node.Tag != null)
       {
           //...
           //code determining whether data has been loaded is done here
           //setting bLoaded true or false
           //...
       }
       else
       {
           e.DrawDefault = true;
           return;
       }

       Font useFont = null;
       Brush useBrush = null;

       if (bLoaded)
       {
           useFont = e.Node.TreeView.Font;
           useBrush = SystemBrushes.WindowText;
        }
        else
        {
            useFont = m_grayItallicFont;
            useBrush = SystemBrushes.GrayText;
        }
        e.Graphics.DrawString(e.Node.Text, useFont, useBrush, e.Bounds.Location);
    }
}

Ich dachte, dass das reichen würde, aber was einige Probleme;

  1. Wenn ein Knoten ausgewählt ist, fokussiert oder nicht, es spielt keine umhüllen den gesamten text, Beispiel (ich hoffe, imgur ist ok).
  2. Wenn der Knoten ausgerichtet ist, die punktierte Linie nicht nachweisen. Wenn Sie es vergleichen mit dieser Beispiel. Die Knoten mit den "anmelden" im text sind mit dem e.DefaultDraw = true

Ich habe versucht, nach dem Beispiel in diese Frage. Es sah etwas wie dieses:

private void TreeViewDrawNode(object sender, DrawTreeNodeEventArgs e)
 {
  if (!e.Node.IsVisible)
  {
   return;
  }

  bool bLoaded = false;

  if (e.Bounds.Location.X >= 0 && e.Bounds.Location.Y >= 0)
  {
     if(e.Node.Tag != null)
     {
      //...
      //code determining whether data has been loaded is done here
      //setting bLoaded true or false
      //...
     }
     else
     {
      e.DrawDefault = true;
      return;
     }

   //Select the font and brush depending on whether the property has been loaded
   Font useFont = null;
   Brush useBrush = null;

   if (bLoaded)
   {
    useFont = e.Node.TreeView.Font;
    useBrush = SystemBrushes.WindowText;
   }
   else
   {
    //member variable defined elsewhere
    useFont = m_grayItallicFont;
    useBrush = SystemBrushes.GrayText;
   }

   //Begin drawing of the text

   //Get the rectangle that will be used to draw
   Rectangle itemRect = e.Bounds;
   //Move the rectangle over by 1 so it isn't on top of the check box
   itemRect.X += 1;

   //Figure out the text position
   Point textStartPos = new Point(itemRect.Left, itemRect.Top);
   Point textPos = new Point(textStartPos.X, textStartPos.Y);

   //generate the text rectangle
   Rectangle textRect = new Rectangle(textPos.X, textPos.Y, itemRect.Right - textPos.X, itemRect.Bottom - textPos.Y);

   int textHeight = (int)e.Graphics.MeasureString(e.Node.Text, useFont).Height;
   int textWidth = (int)e.Graphics.MeasureString(e.Node.Text, useFont).Width;

   textRect.Height = textHeight;

   //Draw the highlighted box
   if ((e.State & TreeNodeStates.Selected) != 0)
   {
    //e.Graphics.FillRectangle(SystemBrushes.Highlight, textRect);
    //use pink to see the difference
    e.Graphics.FillRectangle(Brushes.Pink, textRect);
   }
   //widen the rectangle by 3 pixels, otherwise all of the text     won't fit
   textRect.Width = textWidth + 3;

   //actually draw the text
   e.Graphics.DrawString(e.Node.Text, useFont, useBrush, e.Bounds.Location);

   //Draw the box around the focused node
   if ((e.State & TreeNodeStates.Focused) != 0)
   {
    textRect.Width = textWidth;
    Pen focusPen = new Pen(Color.Black);
    focusPen.DashStyle = System.Drawing.Drawing2D.DashStyle.Dot;
    e.Graphics.DrawRectangle(focusPen, textRect);
   }
  }
 }

Waren jedoch die Ergebnisse diese. (Beachten Sie, verwendet, rosa für die Unterscheidung von Farben). Wie Sie sehen können, werden die markierten hintergrund erweitern nicht den ganzen Weg, wo der fokussierte gepunktete Linie an. Und es gibt auch ein anderes Feld gezogen, wie gut.

Ich bin etwas ratlos, wie dieses Problem zu beheben. Alles was ich will ist Grau kursiven text, wenn etwas geladen wird. Die erste und einfachste Ansatz nicht ganz funktioniert und die zweite Methode fühlt sich an wie ich mache viel zu viel.

Nachdem alle, hat jemand irgendwelche Vorschläge auf, wie Sie dies richtig tun, weil es ja eine einfachere Möglichkeit.

Vielen Dank im Voraus.

  • Ich danke Ihnen sehr für if (!e.Node.IsVisible) return; ich hatte so viele Fragen, ohne Sie!
InformationsquelleAutor Emmanuel F | 2010-01-12
Schreibe einen Kommentar