所以我现在花了大约三天时间搜索互联网——谷歌、堆栈溢出、微软的 C# 文档——并没有产生任何有用的结果。我的问题是我最近创建了一个非常灵活和快速的语法突出显示 RichTextBox,它保存在 UserControl 中。我使用 WinForms 创建了这个。
然而,尽管我的项目的速度和灵活性很高,但仍然存在一个明显且极其令人讨厌的故障。这个故障是我的 RichTextBox 会自动滚动...所有...时间。我不希望这种自动滚动发生。当我突出显示文本时,我希望用户看不到移动或过渡,而只看到彩色字母和符号。这是影响我的项目的语法突出显示的代码:
[DllImport("user32.dll")]
private static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wp, IntPtr lp);
private void DoHighlight()
{
if (TextEditor.Text.Length <= 0)
return;
int visibleStart = TextEditor.GetCharIndexFromPosition(new Point(1, 1));
int visibleEnd = TextEditor.GetCharIndexFromPosition(new Point(1, TextEditor.Height - 1)) + TextEditor.Lines[BottomLine].Length;
int[] curSelection = new [] {TextEditor.SelectionStart,TextEditor.SelectionLength};
LineCounter.Focus();
SendMessage(TextEditor.Handle, WM_SETREDRAW, (IntPtr)0, IntPtr.Zero);
TextEditor.SelectAll();
TextEditor.SelectionColor = TextEditor.ForeColor;
if (parser != null)
parser.HighlightText(this, visibleStart, visibleEnd);
TextEditor.SelectionStart = curSelection[0];
TextEditor.SelectionLength = curSelection[1];
SendMessage(TextEditor.Handle, WM_SETREDRAW, (IntPtr)1, IntPtr.Zero);
TextEditor.Invalidate();
TextEditor.Focus();
}
在进行了一些调试并使用了许多断点之后,我确定在 DoHighlight() 方法完成并运行它之后才会发生自动滚动。
另外,我认为重要的是要注意,只要 RichTextBox 的文本现在发生变化,就会调用这个 DoHighlight() 方法。