Laden...

TextBox durch RichTextbox ersetzen

Erstellt von sindibad vor 11 Jahren Letzter Beitrag vor 11 Jahren 1.950 Views
S
sindibad Themenstarter:in
110 Beiträge seit 2012
vor 11 Jahren
TextBox durch RichTextbox ersetzen

Hallo,
Ich benutze in mein Programm ein TextBox für die die Log-Ausgaben. Der TextBox ist auch editierbar und der Benutzer kann text schreiben.
jetzt muss ich ich aus dem Programm heraus Fehlertext bei Exceptions in rot schreiben.
weil TextBox dies nicht unterstützt, habe ich RichTextBox genommen. RichTextBox funktioniert wieder ganz anderes und ist komplizierter oder mache ich was falsch.
geht es einfacher mit RichTextBox?

Text Schreiben in Log Box mit TextBox:


 logTextBox.Text += time + " " + text + Environment.NewLine;
 logTextBox.ScrollToEnd();
 logTextBox.SelectionStart = logTextBox.Text.Length - 1;

mit RichTextBox:


TextRange tr = new TextRange(logTextBox.Document.ContentEnd, logTextBox.Document.ContentEnd);    
tr.Text = time + " " + text + Environment.NewLine;
tr.ApplyPropertyValue(TextElement.ForegroundProperty, foreGround);

Handler für das editieren in RichTextBox.
TextBox-Code ist auskommentiert


 private void logTextBoxKeyDown(object sender, KeyEventArgs e)
        {
            if (sender.GetType() == typeof(RichTextBox))
            {
                if (e.Key == Key.Return)
                {
                    try
                    {
                        //m_win.m_logFile.logData(">> " + logTextBox.Text.Substring(logTextBox.Text.LastIndexOf(Environment.NewLine) + 1) + " <<");
                        //logTextBox.Text = logTextBox.Text + Environment.NewLine;
                        //logTextBox.SelectionStart = logTextBox.Text.Length;
                        string logTextBox_Text = new TextRange(logTextBox.Document.ContentStart, logTextBox.Document.ContentEnd).Text;
                        m_win.m_logFile.logData(">> " + logTextBox_Text.Substring(logTextBox_Text.LastIndexOf(Environment.NewLine) + 1) + " <<");
                        TextRange tr = new TextRange(logTextBox.Document.ContentEnd, logTextBox.Document.ContentEnd);
                        tr.Text = Environment.NewLine;
                        logTextBox.Selection.Select(logTextBox.Document.ContentEnd, logTextBox.Document.ContentEnd);
                    }
                    catch (Exception ex)
                    {
                        m_win.m_logFile.logData(ex.Message);
                    }
                }
                else
                {
                    try
                    {
                        logTextBox.Selection.Select(logTextBox.Document.ContentEnd, logTextBox.Document.ContentEnd);
                        //logTextBox.SelectionStart = logTextBox.Text.Length;
                    }
                    catch (Exception ex)
                    {
                        m_win.m_logFile.logData(ex.Message);
                    }
                }
            }
        }

C
80 Beiträge seit 2010
vor 11 Jahren

Hallo sindibad,

Eine RichTextBox ist das richtige Control für deine Anforderung, weil - wie du bereits selbst geschildert hast - die einfache TextBox dies nicht unterstützt.

Grundsätzlich musst du beim "Auftreten"/Loggen einer Exception den Text in die Box schreiben und den StartIndex sowie die Länge des Textes innerhalb der Box ermitteln. Anschließend musst du die Infos den Properties SelectionStart und SelectionLength der Box übergeben und entsprechend die SelectionColor setzen.

Dies sollte dir eventuell helfen:RichTextBox Textteile farbig markieren

So wie ich das sehe, verwendest du Windows Forms und nicht WPF.

S
sindibad Themenstarter:in
110 Beiträge seit 2012
vor 11 Jahren

Hallo,
danke für die Antwort,
aber wie kommst du darauf, dass ich Windows Forms benutze?
normaleweise benutze ich WPF und keine Windows Forms.
und der WPF-RichTextBox hat keine Eigenschaften wie SelectionStart und SelectionLength !

16.807 Beiträge seit 2008
vor 11 Jahren

Die WPF RichTextBox hat ein Document Property.
Der Typ dessen ist zB ein FlowDocument.

FlowDocument selbst hat wiederum die Property Blocks, der man via Add() einfach Paragraph-Element hinzufügen kann. Ein Paragraph wiederum empfängt gerne ein Run-Element, dem man direkt Text eintragen und farbig setzen kann.

Edit: Das ist auch im einzigen Beispiel, das die WPF RichTextBox in der MSDN hat, zu sehen ⚠MSDN RichTextBox
[Hinweis] Wie poste ich richtig? 1.1