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;
- Wenn ein Knoten ausgewählt ist, fokussiert oder nicht, es spielt keine umhüllen den gesamten text, Beispiel (ich hoffe, imgur ist ok).
- 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!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Benötigen Sie TextRenderer.DrawText(). Das ist es, was TreeView verwendet, es macht den text etwas anders von der Grafik.DrawString().