制作一个简单的搜索功能,使光标跳转到(或突出显示)搜索的单词

Sag*_*981 5 c# search highlight richtextbox cpu-word

我现在用了很长时间,试图找出问题,我认为这不会那么难.

这是交易:

我正在使用C#和WPF编写一个小应用程序.

我有一个包含FlowDocument的RichTextBox.

我在我的richtextbox下面添加了一个小文本框和一个按钮.

然后,用户键入他/她希望搜索的单词,并按下按钮.

然后,richtextbox将跳转到该单词的第一个出现位置.

它只是跳到正确的行就足够了 - 它也可以通过单词选择,突出显示或放置光标 - 只要将richTextBox滚动到单词,任何事情都可以.

继续按下按钮,然后跳转到该单词的下一个出现,依此类推,直到文档结束.

正如我所说 - 我认为这是一项简单的任务 - 但是我遇到了严重的问题.

Ray*_*rns 13

这应该做的工作:

public bool DoSearch(RichTextBox richTextBox, string searchText, bool searchNext)
{
  TextRange searchRange;

  // Get the range to search
  if(searchNext)
    searchRange = new TextRange(
        richTextBox.Selection.Start.GetPositionAtOffset(1),
        richTextBox.Document.ContentEnd);
  else
    searchRange = new TextRange(
        richTextBox.Document.ContentStart,
        richTextBox.Document.ContentEnd);

  // Do the search
  TextRange foundRange = FindTextInRange(searchRange, searchText);
  if(foundRange==null)
    return false;

  // Select the found range
  richTextBox.Selection.Select(foundRange.Start, foundRange.End);
  return true; 
}

public TextRange FindTextInRange(TextRange searchRange, string searchText)
{
  // Search the text with IndexOf
  int offset = searchRange.Text.IndexOf(searchText);
  if(offset<0)
    return null;  // Not found

  // Try to select the text as a contiguous range
  for(TextPointer start = searchRange.Start.GetPositionAtOffset(offset); start != searchRange.End; start = start.GetPositionAtOffset(1))
  {
    TextRange result = new TextRange(start, start.GetPositionAtOffset(searchText.Length);
    if(result.Text == searchText)
      return result;
  }
  return null;
}
Run Code Online (Sandbox Code Playgroud)

FindTextInRange中for()循环的原因遗憾的是,range.Text删除了非文本字符,因此在某些情况下,IndexOf计算的偏移量将略微过低.

  • 谢谢.当你输入一个想法并且不费心去尝试时会发生这种情况.我在我的回答中编辑了false - > null. (2认同)