RichTextBox search'nplace的结果是错开的

时间:2012-12-24 18:51:03

标签: regex silverlight richtextbox

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

现在我想突出显示文本中的关键字,方法是将它们加粗并以红色着色。我在一个很好的字符串表中有我的单词列表,我用这种方式浏览(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");
    }
}

现在我觉得这样可以解决问题。但不知何故,只有第一个单词才能正确突出显示。然后,亮点的第二次出现在两个早期开始,正确的字母数量突出显示,但在实际单词之前有几个字符。然后,对于第三次出现,它更早的字符等等。

您是否知道导致此行为的原因是什么?

编辑(2013年7月1日):仍然没有弄清楚为什么这些结果是错开的......到目前为止,我注意到如果我在第二个foreach语句之前创建了一个设置为零的变量,将它添加到每个textpointer的位置并在每个循环结束时将其递增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
    }
}

1 个答案:

答案 0 :(得分:1)

好的!所以我通过阅读this question了解到,每当我修改样式时,它会在文本中添加4个字符,这就是弄乱我的设置。

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

完成此选择后,我按其中每个成员的开始属性命令我的出现列表。我现在可以放心,我在 foreach 循环中浏览的每个出现都是文本中的下一个,而不考虑其内容或长度。我知道我想用哪种颜色显示,所以我可以区分不同的关键字。

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