添加行时保持TextBox滚动位置

Anl*_*nlo 8 .net c# textbox winforms

在我的WinForm应用程序中,我有一个多行TextBox控件(uiResults),用于在处理大量项目时报告进度.使用AppendText非常适合在每次更新时自动滚动到底部,但如果用户向后滚动以读取一些旧数据,我需要关闭自动滚动.如果可能的话,我宁愿远离P/Invoke电话.

是否可以检测用户是否在不使用P/Invoke的情况下向后滚动?现在,我只检查SelectionStart哪个有效,但要求用户从文本框的末尾移动插入符号以停止自动滚动:

if(uiResults.SelectionStart == uiResults.Text.Length)
{
  uiResults.AppendText(result + Environment.NewLine);
}
Run Code Online (Sandbox Code Playgroud)

我的主要问题是,当使用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();
}
Run Code Online (Sandbox Code Playgroud)

Joh*_*len 4

自动滚动文本框使用的内存超出预期

问题中的代码完全实现了您正在寻找的内容。添加文本,但仅当滚动条位于最底部时才会发生滚动。