我有一个 RichText,并且想要实现高亮搜索,就像您在 VS 或 Chrome 中看到的那样。我得到了一个相当有效的实现:
private void _txtSearch_TextChanged(object sender, EventArgs e)
{
new RichTextNode(richTextBox1).Highlight(_txtSearch.Text);
}
public void Highlight(string text)
{
textBox.BeginUpdate(); // Extension, implemented with P/Invoke
textBox.SelectionStart = 0;
textBox.SelectionLength = textBox.Text.Length;
textBox.SelectionBackColor = textBox.BackColor;
int highlights = 0;
if (!string.IsNullOrEmpty(text))
{
int pos = 0;
string boxText = textBox.Text;
while ((pos = boxText.IndexOf(text, pos, StringComparison.OrdinalIgnoreCase)) != -1 && (highlights++) < 500)
{
textBox.SelectionStart = pos;
textBox.SelectionLength = text.Length;
textBox.SelectionBackColor = Color.Yellow;
pos += text.Length;
}
}
textBox.EndUpdate(); // Extension, implemented with P/Invoke
}
但是,我想支持大量文本 - 最多 2MB。当有很多文本时,每次这样的更新需要 250 毫秒。单次搜索没问题 - 但是,我的搜索是增量搜索,这意味着如果用户键入 10 个字母的作品,每个字母会在 250 毫秒后出现,这看起来很糟糕。
我使用计时器实现了等待:
private void _txtSearch_TextChanged(object sender, EventArgs e)
{
performSearch.Stop();
performSearch.Interval = 100; // Milliseconds
performSearch.Start();
}
private void performSearch_Tick(object sender, EventArgs e)
{
new RichTextNode(richTextBox1).Highlight(_txtSearch.Text);
performSearch.Stop();
}
这工作得很好。但是,当文本很短时,它会减慢增量搜索,这是次优的。我想我可以数数字符,但这感觉就像一个黑客......
理想情况下,我不想强调何时会有额外的击键:
private void _txtSearch_TextChanged(object sender, EventArgs e)
{
if (!_txtSearch.Magic_are_additional_TextChanged_events_already_queued())
new RichTextNode(richTextBox1).Highlight(_txtSearch.Text);
}
有没有办法做到这一点?或者计时器解决方案是我所希望的最好的解决方案?