【问题标题】:Change back color of specific text in richtextbox wpf更改richtextbox wpf中特定文本的颜色
【发布时间】:2018-01-02 17:53:19
【问题描述】:

我正在研究功能,它将改变 RichTextBox 文本中标签的颜色(等等等等 这将被改变等等等等)。我试图编写一些代码,但它只正确突出显示第一个标签。第二个标签将在几个字符之前突出显示。请问,我怎么能得到这个工作?

实际状态 - 函数只正确着色第一个标签,其他是之前的彩色字符。

我想要的状态 - 只有彩色标签,它是 RichTextBox 中的内容。

问题部分:

        TextPointer text = txbPlainText.Document.ContentStart;
        while (text.GetPointerContext(LogicalDirection.Forward) != TextPointerContext.Text)
        {
          text = text.GetNextContextPosition(LogicalDirection.Forward);
        }
        TextPointer start = text.GetPositionAtOffset(tagStartIndex);
        TextPointer end = text.GetPositionAtOffset(i + tagBuilder.Length);

        TextRange textRange = new TextRange(start, end);
        textRange.ApplyPropertyValue(TextElement.BackgroundProperty, new SolidColorBrush(Color.FromRgb(220, 204, 163)));

它的样子: Image with problem

这是整个功能:

private void ColorizeTags()
{
  string tagString = string.Empty;
  int tagStartIndex = 0;
  char[] txbChars = GetTxbText().ToCharArray();

  for (int i = 0; i < txbChars.Count(); i++)
  {
    char actualChar = txbChars[i];

    if (actualChar == '<' && txbChars[i + 1] != '/')
    {
      StringBuilder tagBuilder = new StringBuilder();
      foreach (string tag in TagList)
      {
        for (int x = i; x < (i + tag.Length); x++)
        {
          if (x > txbChars.Count())
          {
            break;
          }

          tagBuilder.Append(txbChars[x]);
        }

        if (tagBuilder.ToString() == tag)
        {
          tagString = tagBuilder.ToString();
          tagStartIndex = i;
          break;
        }
      }
    }
    else if (actualChar == '<' && txbChars[i + 1] == '/')
    {
      if (string.IsNullOrWhiteSpace(tagString))
      {
        continue;
      }

      string endTag = tagString.Insert(tagString.IndexOf('<') + 1, "/");
      StringBuilder tagBuilder = new StringBuilder();

      for (int c = i; c < (i + endTag.Length); c++)
      {
        tagBuilder.Append(txbChars[c]);
      }

      if (tagBuilder.ToString() == endTag)
      {
        TextPointer text = txbPlainText.Document.ContentStart;
        while (text.GetPointerContext(LogicalDirection.Forward) != TextPointerContext.Text)
        {
          text = text.GetNextContextPosition(LogicalDirection.Forward);
        }
        TextPointer start = text.GetPositionAtOffset(tagStartIndex);
        TextPointer end = text.GetPositionAtOffset(i + tagBuilder.Length);

        TextRange textRange = new TextRange(start, end);
        textRange.ApplyPropertyValue(TextElement.BackgroundProperty, new SolidColorBrush(Color.FromRgb(220, 204, 163)));
        tagString = string.Empty;
        continue;
      }
    }
  }
}

private string GetTxbText()
{
  return new TextRange(txbPlainText.Document.ContentStart, txbPlainText.Document.ContentEnd).Text;
}

【问题讨论】:

  • 请阅读如何创建minimal, complete, verifiable example 并通过编辑将缺少的信息添加到您的帖子中:) 如果您还没有阅读[如何提问](stackoverflow.com/help/how-to-ask) 但我建议这样做:) 我强烈建议遵循我链接的 2 个指南,因为当帖子遵循这些指南时,SO 上的人更有可能回答问题。您能否再次澄清一下“WantedState”和“CurrentState”是什么?欢迎使用 StackOverflow
  • 对不起。现在我希望它会更好。

标签: c# richtextbox


【解决方案1】:

我搜索并发现了问题。问题是当我得到开始和结束的位置偏移时,当前文本指针的值已经改变。

第二个问题是,我的TextPointer text 忽略了空格,解决方案如下。

解决方法:不要直接得到位置偏移。

之前:

...
TextPointer text = txbPlainText.Document.ContentStart;
while (text.GetPointerContext(LogicalDirection.Forward) != TextPointerContext.Text)
{
  text = text.GetNextContextPosition(LogicalDirection.Forward);
}
TextPointer start = text.GetPositionAtOffset(tagStartIndex);
TextPointer end = text.GetPositionAtOffset(i + tagBuilder.Length);
...

之后:

...
TextPointer text = txbPlainText.Document.ContentStart;
TextPointer start = GetTextPointAt(text, tagStartIndex);
TextPointer end = GetTextPointAt(text, endIndex);
...

private static TextPointer GetTextPointAt(TextPointer from, int pos)
{
  TextPointer ret = from;
  int i = 0;

  while ((i < pos) && (ret != null))
  {
    if ((ret.GetPointerContext(LogicalDirection.Backward) == TextPointerContext.Text) || (ret.GetPointerContext(LogicalDirection.Backward) == TextPointerContext.None))
      i++;

    if (ret.GetPositionAtOffset(1, LogicalDirection.Forward) == null)
      return ret;

    ret = ret.GetPositionAtOffset(1, LogicalDirection.Forward);
  }

  return ret;
}

Source of answer

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-01
    • 2013-06-15
    • 2012-07-28
    • 2017-03-27
    • 2013-10-25
    • 2016-02-02
    • 2013-06-02
    相关资源
    最近更新 更多