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?
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.
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;
}
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
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.
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.
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;
}
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.