我目前正在尝试在包含关键字的搜索后生成彩色结果。我的代码显示了一个富文本框,其中包含被搜索引擎成功命中的文本。
现在我想突出显示文本中的关键字,将它们加粗并涂成红色。我在一个漂亮的字符串表中有我的单词列表,我以这种方式浏览(rtb 是我的 RichTextBox,plainText 是唯一从 rtb 运行的,包含它的整个文本):
rtb.SelectAll();
string allText = rtb.Selection.Text;
string expression = "";
foreach (string word in words)
{
expression = Regex.Escape(word);
Regex regExp = new Regex(expression);
foreach (Match match in regExp.Matches(allText))
{
TextPointer start = plainText.ContentStart.GetPositionAtOffset(match.Index, LogicalDirection.Forward);
TextPointer end = plainText.ContentStart.GetPositionAtOffset(match.Index + match.Length, LogicalDirection.Forward);
rtb.Selection.Select(start, end);
rtb.Selection.ApplyPropertyValue(Run.FontWeightProperty, FontWeights.Bold);
rtb.Selection.ApplyPropertyValue(Run.ForegroundProperty, "red");
}
}
现在我认为这可以解决问题。但不知何故,只有第一个单词被正确突出显示。然后,突出显示的第二次出现提前两次,正确数量的字母被突出显示,但在实际单词之前有几个字符。然后对于第三次出现,更早的字符更多,等等。
你知道是什么导致了这种行为吗?
编辑(01/07/2013):仍然没有弄清楚为什么这些结果是交错的......到目前为止,我注意到如果我在第二个 foreach 语句之前创建了一个设置为零的变量,将它添加到每个文本指针的位置并递增在每个循环结束时将它加 4(不知道为什么),结果被充分着色。然而,如果我搜索两个或更多关键字(无论它们大小是否相同),第一个关键字的每次出现都会正确着色,但只有其他关键字的第一次出现是正确着色的。(其他人再次交错)这是编辑后的代码:
rtb.SelectAll();
string allText = rtb.Selection.Text;
string expression = "";
foreach (string word in words)
{
expression = Regex.Escape(word);
Regex regExp = new Regex(expression);
int i = 0;
foreach (Match match in regExp.Matches(allText))
{
TextPointer start = plainText.ContentStart.GetPositionAtOffset(match.Index + i, LogicalDirection.Forward);
TextPointer end = plainText.ContentStart.GetPositionAtOffset(match.Index + match.Length + i, LogicalDirection.Forward);
rtb.Selection.Select(start, end);
rtb.Selection.ApplyPropertyValue(Run.FontWeightProperty, FontWeights.Bold);
rtb.Selection.ApplyPropertyValue(Run.ForegroundProperty, "red");
i += 4; // number found out from trials
}
}