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计算的偏移量将略微过低.
归档时间: |
|
查看次数: |
5983 次 |
最近记录: |