【问题标题】:WPF RichTextBox appending coloured textWPF RichTextBox 附加彩色文本
【发布时间】:2011-07-27 15:25:05
【问题描述】:

我正在使用RichTextBox.AppendText 函数将字符串添加到我的RichTextBox。我想用特定的颜色设置它。我该怎么做?

【问题讨论】:

    标签: c# wpf colors richtextbox


    【解决方案1】:

    试试这个:

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 颜色变化对于随后调用内置AppendText(text) 方法添加的文本仍然有效。如果将附加文本颜色重置为控件的前景可能会更好。 (见WinForms version。)
      【解决方案3】:

      以上单行答案:-

        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) 
      

      【讨论】:

      • 如果这是对我上面的回答的回应,您还必须包含扩展方法定义才能使用它。
      • 你没有理解omni创建了一个允许传递颜色名称的扩展方法
      【解决方案4】:

      注意 TextRange 的开销

      我花了很多时间扯头发,因为 TextRange 对于我的用例来说不够快。这种方法避免了开销。我进行了一些准系统测试,速度提高了约 10 倍 (但不要相信我的话,哈哈,运行你自己的测试)

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

      Credit

      注意:我认为大多数用例都应该适用于 TextRange。我的用例涉及数百个单独的附加,而且开销会累积起来。

      【讨论】:

      • 有没有办法为 Run 着色(如问题所问)?
      【解决方案5】:

      只是一个完整的例子,它将原始问题与托尼先前的评论混合在一起

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

      现在,它又快又彩色了 :)

      请注意(与 TextRange 解决方案不同)此解决方案还解决了我在 RichTextBox 第一行出现的换行问题。

      【讨论】:

        【解决方案6】:

        我最终综合了 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);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-11-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多