2

我目前正在尝试在包含关键字的搜索后生成彩色结果。我的代码显示了一个富文本框,其中包含被搜索引擎成功命中的文本。

现在我想突出显示文本中的关键字,将它们加粗并涂成红色。我在一个漂亮的字符串表中有我的单词列表,我以这种方式浏览(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
    }
}
4

1 回答 1

1

好的!所以我通过阅读这个问题了解到,每次我修改样式时,都会在文本中添加 4 个字符,这就是我的设置混乱的原因。

为了解决这个问题,由于我可能有多个关键字,并且它们不会按照它们在搜索框中的输入顺序一个接一个地出现在文本中,我必须首先浏览我的文本以找到每个出现的位置关键字不修改文字。对于每次出现,我将出现的开始位置结束位置所需颜色存储在自定义列表中。

完成此选择后,我按其中每个成员的start属性对我的出现列表进行排序。我现在可以确信,我在foreach循环中浏览的每个出现都是文本中的下一个出现,而不管其内容或长度。而且我知道我想让它以哪种颜色出现,这样我就可以区分不同的关键字。

然后,最后,我可以浏览有序列表的每个成员并修改文本的样式,因为我知道下一个单词将出现在文本的后面,所以我必须在每个循环结束时将 4 个字符添加到我的索引中。

于 2013-01-07T15:57:24.353 回答