27 votes

WPF RichTextBox ajoutant du texte coloré

J'utilise le RichTextBox.AppendText pour ajouter une chaîne à mon RichTextBox . J'aimerais lui donner une couleur particulière. Comment puis-je le faire ?

41voto

Kishore Kumar Points 8636

Essaie juste ça :

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

22voto

omni Points 446

Si vous le souhaitez, vous pouvez également en faire une méthode d'extension.

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) { }
}

Cela vous permettra de faire

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

ou en hexagone comme

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

Si la chaîne de couleur que vous tapez n'est pas valide, il la tape simplement dans la couleur par défaut (noir). J'espère que cela vous aidera !

7voto

Tony Points 108

Attention à la surcharge de TextRange

J'ai passé beaucoup de temps à m'arracher les cheveux, parce que TextRange n'était pas assez rapide pour mon cas d'utilisation. Cette méthode évite les frais généraux. J'ai effectué quelques tests de base, et elle est plus rapide d'un facteur d'environ 10. (mais ne me croyez pas sur parole lol, faites vos propres tests)

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

Crédit

Note : Je pense que la plupart des cas d'utilisation devraient fonctionner correctement avec TextRange . Mon cas d'utilisation impliquait des centaines d'ajouts individuels, et cette surcharge s'accumule.

4voto

Kino101 Points 116

Juste un exemple complet qui mélange la question originale avec une remarque précédente de Tony.

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

Maintenant, c'est rapide et coloré :)

Notez que (contrairement à la solution TextRange) cette solution m'a également permis de résoudre un problème de rupture de ligne survenant à la première ligne de la RichTextBox.

0voto

Jack Points 460

J'ai fini par synthétiser les réponses d'Omni et de Kishores et par créer ainsi une méthode d'extension :

public static void AppendText(this System.Windows.Controls.RichTextBox box, string text, SolidColorBrush brush)
{
    TextRange tr = new TextRange(box.Document.ContentEnd, box.Document.ContentEnd);
    tr.Text = text;
    tr.ApplyPropertyValue(TextElement.ForegroundProperty, brush);
}

Ce qui peut être appelé ainsi :

MyTextBox.AppendText("Some Text\n", Brushes.Green);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X