在C#中,如果我们在使用 TextBox 控件 或者 RichTextBox 控件进行文本输入输出时,我们期望是希望当前正在进行操作的行,或者当前正在更新的行,始终保持在可见的范围内,以利于阅读或者编辑操作。
我们可以通过设置控件的 HideSelection 为 false, 或者在代码中适当的时机调用 ScrollToCaret 方法来达到上述的目的,下面就这两种实现方式所呈现的效果,简做展示。
使用 ScrollToCaret() 的代码块如下
private void rtfInserterByText(RichTextBox rtb,string context,Color color,Font font,bool onNewLine=false)
{
if (string.IsNullOrEmpty(rtb.Text))
{
// 当 rtb 中没有内容时,不响应新行要求
onNewLine = false;
}
rtb.SuspendLayout();
rtb.SelectionStart = rtb.TextLength;
rtb.SelectionLength = 0;
//设置即将输入的内容的颜色和字体
rtb.SelectionColor = color;
rtb.SelectionFont = (font ?? rtb.Font);
rtb.AppendText(onNewLine ? $"{Environment.NewLine}{context}":context);
rtb.ScrollToCaret();
rtb.ResumeLayout();
}
ScrollToCaret方法的功能效果表现如下:
在上图所展示的方法中,我们可以看到,光文本内容超过可见范围时,窗口会出现闪屏效果,并且当前正在出内容其实是没有显示完整的。
不调用 ScrollToCaret 方法,为了使光标一直保持在可见范围内,我们可以将 HideSselecton设置为 false,代码如下:
private void rtfInserterByText(RichTextBox rtb,string context,Color color,Font font,bool onNewLine=false)
{
if (string.IsNullOrEmpty(rtb.Text))
{
// 当 rtb 中没有内容时,不响应新行要求
onNewLine = false;
}
rtb.SuspendLayout();
rtb.SelectionStart = rtb.TextLength;
rtb.SelectionLength = 0;
//设置即将输入的内容的颜色和字体
rtb.SelectionColor = color;
rtb.SelectionFont = (font ?? rtb.Font);
rtb.AppendText(onNewLine ? $"{Environment.NewLine}{context}":context);
//rtb.ScrollToCaret();
rtb.ResumeLayout();
}
不调用 ScrollToCaret ,同时设置richTextBox 控件的 HideSselecton 属性为 false,实际效果如下:
上图的效果中可见,当输出的内容超过可见范围时,滚动条会自动滚动以使当前正在输出的行进入视野范围,以保障当前行可见,同时屏幕没有出现闪屏现象。
以上两种方式的效果差异,没有深究,未知其因。如果哪位朋友了解,欢迎留言评论,以正视听,不胜感激。