WPF RichTextBox附加彩色文本

hgncfbus  于 2023-08-07  发布在  其他
关注(0)|答案(7)|浏览(106)

我正在使用RichTextBox.AppendText函数向RichTextBox添加一个字符串。我想把这个镶上一种特别的颜色。我该怎么办?

nwnhqdif

nwnhqdif1#

试试这个

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

字符串

5gfr0r5j

5gfr0r5j2#

如果你愿意,你也可以把它作为一个扩展方法。

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

字符串
这样你就可以

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


或十六进制,例如

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


如果您键入的颜色字符串无效,它只会以默认颜色(黑色)键入。希望这对你有帮助!

w8ntj3qf

w8ntj3qf3#

注意TextRange的开销

我花了很多时间绞尽脑汁,因为TextRange对于我的用例来说不够快。此方法避免了开销。我运行了一些准系统测试,它的速度快了~10倍 (但不要相信我的话,哈哈,运行你自己的测试)

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

字符串
Credit

**注意:**我认为大多数用例都可以很好地使用TextRange。我的用例涉及到数百个单独的追加,而这些开销叠加在一起。

cotxawn7

cotxawn74#

只是一个完整的例子,混合了原来的问题与以前的评论,从托尼

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

字符串
现在,它是快速和彩色的:)

  • 请注意(与TextRange解决方案不同),此解决方案还解决了RichTextBox第一行出现的换行符问题。*
kse8i1jr

kse8i1jr5#

我最终综合了Omni和Kishores的答案,并创建了一个扩展方法:

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

字符串
可以这样称呼:

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

q35jwt9p

q35jwt9p6#

我进一步改进了@Jack的回答:

  • 允许用户传递正面和背景文本颜色
  • 添加一个变通方法,使代码在消息包含换行符的情况下正常工作。
    编码
private void AppendText(RichTextBox textBox,
                        string message,
                        SolidColorBrush fontColor,
                        SolidColorBrush backgroundColor)
{
    // If a message contains line breaks, the code bellow will
    // add an empty blank line for every line break in the message.
    // To avoid that we have to replace all new lines in the mesage with '\r' symbol.
    message = Regex.Replace(message, @"(\r\n)|(\n\r)|(\n)", "\r");

    var textRange = new TextRange(textBox.Document.ContentEnd,
                                  textBox.Document.ContentEnd) { Text = message };
    textRange.ApplyPropertyValue(TextElement.ForegroundProperty, fontColor);
    textRange.ApplyPropertyValue(TextElement.BackgroundProperty, backgroundColor);
}

字符串

Demo

以下代码将显示消息,同时考虑新的线符号:

AppendText(_richTextBox, "First part of the line. ", Brushes.Green, Brushes.Yellow);
AppendText(_richTextBox, "Second part of the line. ", Brushes.Blue, Brushes.White);
AppendText(_richTextBox, "Third part that\ncontains new line in the middle\n", Brushes.LightPink, Brushes.Gray);
AppendText(_richTextBox, "New line\nNew line\nNew line", Brushes.Black, Brushes.White);


x1c 0d1x的数据

jexiocij

jexiocij7#

上面一行回答:

myRichTextBox.AppendText("items", "CornflowerBlue")

字符串
不起作用。正确的写法应该是(我用的是VS 2017):-

Dim text1 As New TextRange(myRichTextBox.Document.ContentStart, myRichTextBox.Document.ContentEnd)
  myRichTextBox.AppendText("items")
  text1.ApplyPropertyValue(TextElement.ForegroundProperty, Brushes.CornflowerBlue)

相关问题