【发布时间】: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