在我的 WinForm 应用程序中,我有一个多行文本框控件 (uiResults),用于在处理大量项目时报告进度。使用 AppendText 非常适合在每次更新时自动滚动到底部,但如果用户回滚以读取一些较旧的数据,我需要关闭自动滚动。如果可能的话,我宁愿远离 P/Invoke 调用。
是否可以在不使用 P/Invoke 的情况下检测用户是否向后滚动?现在,我只检查 SelectionStart 哪个有效,但需要用户从文本框的末尾移动插入符号以停止自动滚动:
if(uiResults.SelectionStart == uiResults.Text.Length)
{
uiResults.AppendText(result + Environment.NewLine);
}
我的主要问题是,使用 Text 属性附加字符串时,文本框会滚动到开头。我试图通过存储插入符号位置并在更新后重置并滚动到它来解决这个问题,但这会导致当前行移动到底部(当然,因为 ScrollToCaret 滚动的距离不超过使插入符号进入视图所需的距离)。
[Continued from above]
else
{
int pos = uiResults.SelectionStart;
int len = uiResults.SelectionLength;
uiResults.Text += result + Environment.NewLine;
uiResults.SelectionStart = pos;
uiResults.SelectionLength = len;
uiResults.ScrollToCaret();
}