2010-02-16 8 views
51

ich den folgenden Code bin mit meiner TreeNodes fett zu machen:C# WinForms fett Treeview Knoten zeigt nicht ganzen Text

Font font = new Font(tvQuestionSequence.Font, FontStyle.Bold); 

foreach (QuestionnaireBuilder_Category cat in categories) 
{ 
    TreeNode node = new TreeNode(); 

    node.Text = cat.Description; 
    node.Name = cat.Id.ToString(); 

    node.NodeFont = font; 

    tvQuestionSequence.Nodes.Add(node); 
} 

Aber der Text des fett Knoten wird nicht richtig angezeigt. Die letzten Buchstaben werden nicht angezeigt. Woher? Und wie löst man dieses Problem?

Antwort

15

Ich habe festgestellt, dass dies ein Windows-Problem ist. Eine Problemumgehung für dieses Problem ist das:

Setzen Sie in dem Formularkonstruktor die Schriftart der Strukturansicht auf fett. Wenn Sie Knoten hinzufügen, die nicht fett gedruckt sein dürfen, ändern Sie die Schriftart in "regular":

+0

bedenken Sie, dass '' Font' implementiert IDisposable' so ist es immer es haben sollte 'Dispose' Methode aufgerufen wenn es nicht mehr benötigt wird. Aus diesem Grund sollten Sie wahrscheinlich Ihre 'Font' als Feld erstellen und sicherstellen, dass Sie in der' Dispose'-Methode der 'Form' –

+0

@AdamRalph die' Dispose'-Methode aufrufen, würde die Dispose-Methode nicht 'font' automatisch aufgerufen aufgerufen, den Contructor zu verlassen oder missverstand ich etwas? – Crisfole

+3

Ich denke im obigen Beispiel wird die Schriftart als eine Eigenschaft der Baumansicht gespeichert, die Baumansicht wird durch das Formular entsorgt, die Baumansicht wird dann wiederum die Schriftart entsorgen. Ich nehme an, dass dies der Fall ist, da der Formulardesigner den Steuerelementen neue Schriftarten zuweist und nicht über sie verfügt. – DarrenMB

5

Dies ist ein bekannter Windows-Fehler. Die einfache Lösung besteht darin, ein zusätzliches Leerzeichen am Ende der Strings anzuhängen. Das Leerzeichen ist nicht sichtbar, erhöht jedoch die Anzahl der Pixel, die zum Zeichnen der Zeichenfolge erforderlich sind, sodass die gesamte Zeichenfolge sichtbar ist.

55

Ich habe diesen Beitrag bei der Suche im Internet gefunden, da ich genau das gleiche Problem habe.

Das Hinzufügen eines Leerzeichens am Ende des Knotens war jedoch keine Option, und ich fand einen alternativen Weg, der das Problem zu beheben scheint.

Nachdem ich meine Knotenschriftart Fett gesetzt habe, muss ich nur den Knotentext mit dem gleichen Wert zurücksetzen. Hier

ist der Code-Beispiel:

Font boldFont = new Font(treeview.Font, FontStyle.Bold); 
node.NodeFont = boldFont; 
node.Text = node.Text; 

Es scheint, dass der Knoten nach dem Ändern Sie den Text neu gezeichnet wird, das ist genau das, was ich in erster Linie wollte.

+7

Dies ist die beste Arbeit, die ich bisher gesehen habe. BlunT hat ein chronisches Problem gelöst. – Osiris

+13

Ich musste die Schriftart einstellen, fügen Sie den Knoten zum Baum und dann den Text zurücksetzen, um dies zum Funktionieren zu bringen. Wenn ich die Schriftart festlege und den Text zurücksetze, bevor ich ihn der Baumstruktur hinzufüge, wird der Text immer noch abgeschnitten. –

+0

Dies ist eine etwas bessere Lösung als die vorhandene Antwort, da sie das Dimensionierungsproblem korrigiert, anstatt einfach den Renderbereich der Knoten mit einer breiteren Schriftart zu überdimensionieren. Es ist auch einfach zu implementieren, wenn Sie bereits den treenode verwenden und geerbt haben und die Eigenschaft einfach überschreiben können, um den Text erneut anzuwenden, wenn die Schriftart fett dargestellt wird. Dies hat ein sehr frustrierendes Problem behoben, mit dem ich seit langer Zeit kämpfte, danke. – DarrenMB

0

Sehr einfach und funktioniert gut

treeView1.SelectedNode.NodeFont = new System.Drawing.Font(treeView1.SelectedNode.TreeView.Font, treeView1.SelectedNode.TreeView.Font.Style | FontStyle.Bold); 
      this.treeView1.SelectedNode.Text += string.Empty; 
+2

Die SO-Community bevorzugen eine Erklärung, warum und wie Sie ein Problem auf diese Weise lösen. Wenn Sie also erklären könnten, warum Sie dies tun, wäre Ihr Beitrag viel wertvoller. – ForceMagic

3

Das ist alles für mich nicht zu helfen. Was den Trick gemacht hat, ist, die Schrift zur DESIGN-Zeit etwas größer und fett zu machen. (Im Eigenschaftenfenster)

Also stellen Sie sicher, dass Sie die Baumansicht mit ausreichend großen Schriftarten definieren, später können Sie Knoten mit kleinerer Schrift hinzufügen. Sie werden passen.

3

Ich stimme der Lösung zu. Ich möchte nur hinzufügen, um ein wenig mehr Licht auf das Problem zu werfen. Die Baumansicht hat eine eigene Schriftart, die die Breite der Elemente auf der Stammebene bestimmt. Dies kompensiert die Tatsache, dass nur eine Objekthöheneigenschaft und keine Objektbreiteneigenschaft verfügbar ist.

Die Lösung für Ihr Problem besteht darin, zu bestimmen, wie die Schriftart Ihres Stammknotens sein soll, und dann den Baum auf dieselbe Schriftart setzen. Sie können das auch zur Entwurfszeit tun.

Hoffe, dass jemand hilft.

1

Eine Abhilfe für dieses Problem ist folgendes:

die defaul Schrift von treeview zu fett in den Eigenschaften einstellen.

Und chnage zu nicht fett, wenn Sie brauchen.

0

Ich weiß, das ist ein alter Thread und es wurde vielleicht beantwortet. Ich bin gerade über dieses Problem gestolpert, als ich lernte, TreeViews zu verwenden. Was für mich funktionierte, war das Ändern der Schriftgröße für die gesamte TreeView auf die gleiche Größe oder größer als die Schriftart der Ebene, die Sie fett stellen möchten. Die Standardschriftgröße ist 8. etwas. Ich änderte meins zu 10, das war die Größe, die ich meine Knoten wollte, und das Abschneiden war weg.

0

Was für mich funktionierte: Einhängen in das load-Ereignis im Konstruktor der Steuerung und Anpassen des Knotens wie in BlunTs Antwort erklärt.

public MyControl() 
{ 
    InitializeComponent(); 
    _head = new TreeNode(); 

    this.Load += (s, e) => 
    { 
     trvParts.Nodes.Clear(); 
     _head.NodeFont = new Font(trvParts.Font, FontStyle.Bold); 
     trvParts.Nodes.Add(_head); 
     _head.Text = "Node Name"; 
    }; 
} 
0

Es in vb.Net ist jedoch die Lösung, um den Wert des Textfeldes wird schön um diese erneut ein. Wie in:

With myNode 
     Dim myText As String = .Text 'capture the text 
     .NodeFont = New Font(<name of your treeview>.Font, FontStyle.Bold) 
     .Text = myText 'reset the text to the original value 
End With 
3

Verwenden Sie einfach treeView.BeginUpdate(), bevor Sie fett Knoten dann treeView.EndUpdate(), nachdem Sie den Knoten bolded haben.

0

Ich mache folgendes, ich setze das DrawNode Event zum Aufruf, setzt den Knoten fett und entfernt die markierte Farbe.

Sie können jede beliebige Farbe mit dem ersten Parameter der e.Graphics.FillRectangle-Funktion festlegen.

private void SetNodeBoldWhenSelected(object sender, DrawTreeNodeEventArgs e) 
{ 
    if (e.Node == null) return; 
    var font = e.Node.NodeFont ?? e.Node.TreeView.Font; 
    if (e.Node.IsSelected) 
    { 
     font = new Font(font, FontStyle.Bold);     
    } 

    var bounds = new Rectangle(e.Bounds.X,e.Bounds.Y,e.Bounds.Width+20,e.Bounds.Height); 

    e.Graphics.FillRectangle(SystemBrushes.ControlDarkDark, bounds); 
    TextRenderer.DrawText(e.Graphics, e.Node.Text, font, bounds, SystemColors.HighlightText, TextFormatFlags.GlyphOverhangPadding); 
} 

Nun, wenn ich einen Knoten auswählen erhalte ich 20 Pixel mehr Platz für meine Schrift, das gut funktioniert, kann man die „richtige“ Größe benötigt berechnen, aber es gibt keine Angabe besagt es das man tun muss, aber kann Graphics.MeasureString verwenden, wenn Sie das für nötig halten.

1

Basierend auf MSDN Library, versuchen, Ihren Code ändern:

Font font = new Font(tvQuestionSequence.Font, FontStyle.Bold); 

foreach (QuestionnaireBuilder_Category cat in categories) 
{ 
    TreeNode node = new TreeNode(); 

    node.Text = cat.Description; 
    node.Name = cat.Id.ToString(); 

    node.NodeFont = font; 

    tvQuestionSequence.BeginUpdate(); //added newline here <-- 
    tvQuestionSequence.Nodes.Add(node); 
    tvQuestionSequence.EndUpdate(); //added newline here <-- 
} 

Es ist für mich arbeiten

+0

Vielen Dank für dieses Code-Snippet, das möglicherweise eine begrenzte kurzfristige Hilfe bietet. Eine richtige Erklärung [würde sich erheblich verbessern] (https: //meta.stackexchange.com/questions/114762/erklären-vollständig-code-based-antworten) seinen langfristigen Wert, indem sie zeigen, warum dies eine gute Lösung für das Problem ist und es für zukünftige Leser mit anderen, ähnlichen Fragen nützlicher machen würde. Bitte bearbeiten Sie Ihre Antwort, um einige Erklärungen hinzuzufügen, einschließlich der Annahmen, die Sie getroffen haben –

+0

@ShawnC. Vielen Dank für Ihren Vorschlag –