在我的WinForm应用程序中,我有一个多行TextBox控件(uiResults),用于在处理大量项目时报告进度。使用AppendText非常适合在每次更新时自动滚动到底部,但如果用户滚动回来读取一些较旧的数据,我需要关闭自动滚动。如果可能,我宁愿远离P/Invoke调用。在添加行时维护TextBox滚动位置
是否有可能检测用户是否回滚而不使用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();
}
当垂直滚动条移动并且不通过AppendText触发WM_VSCROLL时触发。是否有不同的信息要捕捉? – 2012-04-16 16:48:06
@Brad Rem。没有理解你的完整问题。更新。 – 2012-04-16 19:49:26