WPF RichTextBox appending coloured text

30,374

Solution 1

Just try this:

TextRange tr = new TextRange(rtb.Document.ContentEnd,­ rtb.Document.ContentEnd);
tr.Text = "textToColorize";
tr.ApplyPropertyValue(TextElement.­ForegroundProperty, Brushes.Red);

Solution 2

If you want, you can also make it an extension method.

public static void AppendText(this RichTextBox box, string text, string color)
{
    BrushConverter bc = new BrushConverter();
    TextRange tr = new TextRange(box.Document.ContentEnd, box.Document.ContentEnd);
    tr.Text = text;
    try 
    { 
        tr.ApplyPropertyValue(TextElement.ForegroundProperty, 
            bc.ConvertFromString(color)); 
    }
    catch (FormatException) { }
}

This will make it so you can just do

myRichTextBox.AppendText("My text", "CornflowerBlue");

or in hex such as

myRichTextBox.AppendText("My text", "0xffffff");

If the color string you type is invalid, it simply types it in the default color (black). Hope this helps!

Solution 3

Be Aware of TextRange's Overhead

I spent a lot of time tearing my hair out, because TextRange wasn't fast enough for my use-case. This method avoids the overhead. I ran some barebones tests, and its faster by a factor of ~10 (but don't take my word for it lol, run your own tests)

Paragraph paragraph = new Paragraph();
Run run = new Run("MyText");
paragraph.Inlines.Add(run);
myRichTextBox.Document.Blocks.Add(paragraph);

Credit

Note: I think most use cases should work fine with TextRange. My use-case involved hundreds of individual appends, and that overhead stacks up.

Solution 4

Just a complete example which mixes original question with previous remark from Tony

var paragraph = new Paragraph();
var run = new Run(message)    
{
    Foreground = someBrush
};
paragraph.Inlines.Add(run);
myRichTextBox.Document.Blocks.Add(paragraph);

Now, it is fast and coloured :)

Note that (unlike the TextRange solution) this solution also solved me a line break issue occurring at the first line of the RichTextBox.

Share:
30,374
Aks
Author by

Aks

Updated on July 19, 2022

Comments

  • Aks
    Aks almost 2 years

    I'm using the RichTextBox.AppendText function to add a string to my RichTextBox. I'd like to set this with a particular colour. How can I do this?