Colorier les différentes parties d'une chaîne RichTextBox

j'essaie de colorer des parties d'une chaîne pour être ajouté à une RichTextBox. J'ai une corde construite à partir de différentes cordes.

string temp = "[" + DateTime.Now.ToShortTimeString() + "] " +
              userid + " " + message + Environment.NewLine;

voilà à quoi ressemblerait le message Une fois qu'il serait construit.

[21:23 PM] User: my message here.

je veux que tout à l'intérieur et en incluant les crochets [9:23] soit d'une couleur, "utilisateur" d'une autre couleur et le message d'une autre couleur. Ensuite, je voudrais la chaîne de caractères ajoutée à ma RichTextBox.

Comment puis-je accomplir?

95
demandé sur Winger Sendon 2009-12-18 07:22:05

6 réponses

Voici une méthode d'extension qui surcharge la méthode AppendText avec un paramètre de couleur:

public static class RichTextBoxExtensions
{
    public static void AppendText(this RichTextBox box, string text, Color color)
    {
        box.SelectionStart = box.TextLength;
        box.SelectionLength = 0;

        box.SelectionColor = color;
        box.AppendText(text);
        box.SelectionColor = box.ForeColor;
    }
}

Et voici comment vous l'utiliseriez:

var userid = "USER0001";
var message = "Access denied";
var box = new RichTextBox
              {
                  Dock = DockStyle.Fill,
                  Font = new Font("Courier New", 10)
              };

box.AppendText("[" + DateTime.Now.ToShortTimeString() + "]", Color.Red);
box.AppendText(" ");
box.AppendText(userid, Color.Green);
box.AppendText(": ");
box.AppendText(message, Color.Blue);
box.AppendText(Environment.NewLine);

new Form {Controls = {box}}.ShowDialog();

notez que vous pouvez remarquer des clignotements si vous émettez beaucoup de messages. Voir CE C# Corner article pour des idées sur la façon de réduire RichTextBox flicker.

212
répondu Nathan Baulch 2009-12-18 07:35:35

j'ai étendu la méthode avec la police comme paramètre:

public static void AppendText(this RichTextBox box, string text, Color color, Font font)
{
    box.SelectionStart = box.TextLength;
    box.SelectionLength = 0;

    box.SelectionColor = color;
    box.SelectionFont = font;
    box.AppendText(text);
    box.SelectionColor = box.ForeColor;
}
10
répondu Renan F. 2015-09-29 21:51:44

C'est la version modifiée que j'ai mise dans mon code (J'utilise .Net 4.5) mais je pense qu'elle devrait fonctionner sur 4.0 aussi.

public void AppendText(string text, Color color, bool addNewLine = false)
{
        box.SuspendLayout();
        box.SelectionColor = color;
        box.AppendText(addNewLine
            ? $"{text}{Environment.NewLine}"
            : text);
        box.ScrollToCaret();
        box.ResumeLayout();
}

des Différences avec l'original:

  • possibilité d'ajouter du texte à une nouvelle ligne ou simplement de l'ajouter
  • pas besoin de modifier la sélection, il fonctionne de la même
  • insérée ScrollToCaret à force de défilement automatique
  • ajouté les appels de suspension/reprise
5
répondu tedebus 2017-07-27 08:48:50

sélection de texte comme dit de quelqu'un, que la sélection apparaît momentanément. Dans Windows Forms applications il n'y a pas d'autres solutions pour le problème, mais aujourd'hui j'ai trouvé une mauvaise, façon de travailler pour résoudre: vous pouvez mettre un PictureBox en chevauchement avec le RichtextBox avec la capture d'écran de si, pendant la sélection et le changement de couleur ou de police, ce qui le rend après réapparaître tout, lorsque l'opération est terminée.

Le Code

est ici...

//The PictureBox has to be invisible before this, at creation
//tb variable is your RichTextBox
//inputPreview variable is your PictureBox
using (Graphics g = inputPreview.CreateGraphics())
{
    Point loc = tb.PointToScreen(new Point(0, 0));
    g.CopyFromScreen(loc, loc, tb.Size);
    Point pt = tb.GetPositionFromCharIndex(tb.TextLength);
    g.FillRectangle(new SolidBrush(Color.Red), new Rectangle(pt.X, 0, 100, tb.Height));
}
inputPreview.Invalidate();
inputPreview.Show();
//Your code here (example: tb.Select(...); tb.SelectionColor = ...;)
inputPreview.Hide();

mieux est d'utiliser WPF; cette solution n'est pas parfaite, mais pour Winform il fonctionne.

0
répondu 2017-01-03 22:21:04
private void Log(string s , Color? c = null)
        {
            richTextBox.SelectionStart = richTextBox.TextLength;
            richTextBox.SelectionLength = 0;
            richTextBox.SelectionColor = c ?? Color.Black;
            richTextBox.AppendText((richTextBox.Lines.Count() == 0 ? "" : Environment.NewLine) + DateTime.Now + "\t" + s);
            richTextBox.SelectionColor = Color.Black;

        }
0
répondu KhaledDev 2017-12-14 08:11:25

je pense que modifier un" texte sélectionné " dans une boîte RichTextBox n'est pas la bonne façon d'ajouter du texte en couleur. Alors voici une méthode pour ajouter un "bloc de couleur":

        Run run = new Run("This is my text");
        run.Foreground = new SolidColorBrush(Colors.Red); // My Color
        Paragraph paragraph = new Paragraph(run);
        MyRichTextBlock.Document.Blocks.Add(paragraph);

de MSDN :

la propriété Blocks est la propriété content de RichTextBox. C'est un collection D'éléments de paragraphe. Contenu de chaque élément du paragraphe peut contenir les éléments suivants:

  • Inline

  • InlineUIContainer

  • Exécuter

  • Span

  • Bold

  • lien Hypertexte

  • Italique

  • Souligner

  • saut de ligne

donc je pense que vous devez diviser votre chaîne de caractères en fonction de la couleur des pièces, et créer autant d'objets Run que nécessaire.

0
répondu Elo 2018-03-08 13:36:07