C#从滚动预防的RichTextBox /跳到顶部(C# Preventing RichTextBo

2019-09-23 17:40发布

看来,使用时System.Windows.Forms.RichTextBox你可以使用textbox.AppendText()textbox.Text = ""添加文本到文本框。

AppendText将滚动至底部,并直接添加文本不会滚动,而当用户都集中在文本框会跳转到顶部。

这里是我的功能:

// Function to add a line to the textbox that gets called each time I want to add something
// console = textbox
public void addLine(String line)
{
    // Invoking since this function gets accessed by another thread
    console.Invoke((MethodInvoker)delegate
    {
        // Check if user wants the textbox to scroll
        if (Settings.Default.enableScrolling)
        {
            // Only normal inserting into textbox here with AppendText()
        }
        else
        {
            // This is the part that doesn't work
            // When adding text directly like this the textbox will jump to the top if the textbox is focused, which is pretty annoying
            Console.WriteLine(line);
            console.Text += "\r\n" + line;
        }
    });
}

我也试过进口user32.dll ,并覆盖了滚动功能,没有工作这么好。

有谁知道如何,一劳永逸,停止文本框的滚动?

它不应该去顶,既不是底,当然也不会在当前选择,而只是留在当前的时刻。

Answer 1:

 console.Text += "\r\n" + line;

这并不做什么,你认为它。 这是一个任务 ,它完全取代了Text属性。 + =操作符是方便的语法糖,但执行的是实际的代码

 console.Text = console.Text + "\r\n" + line;

RichTextBox中没有努力旧文本与新文本比较,寻找可能的匹配,可以保持在同一个地方的插入位置。 因此,它移动插入符回文本的第一行。 这反过来又导致其向后滚动。 跳。

你一定要避免这样的代码,这是非常昂贵。 和不愉快,如果你作出任何努力来格式化文本,你会失去格式。 相反,有利于AppendText通过()方法来添加文本和SelectionText属性来插入文本(改变SelectionStart财产后)。 随着不仅仅是速度的优势,但没有滚动无论是。



Answer 2:

在这之后:

 Console.WriteLine(line);
 console.Text += "\r\n" + line;

只需添加这两条线:

console.Select(console.Text.Length-1, 1);
console.ScrollToCaret();

快乐编码



Answer 3:

然后,如果我正确地得到了你,你应该试试这个:

Console.WriteLine(line);
console.SelectionProtected = true;
console.Text += "\r\n" + line;

当我尝试它,它就像你想让它。



Answer 4:

我必须实现类似的东西,所以我想分享...

什么时候:

  • 关注用户:没有滚动
  • 没有聚焦用户:滚动到底

我把汉斯帕桑特的有关使用AppendText通过的建议()和SelectionStart财产。 这里是我的代码看起来像:

int caretPosition = myTextBox.SelectionStart;

myTextBox.AppendText("The text being appended \r\n");

if (myTextBox.Focused)
{
    myTextBox.Select(caretPosition, 0);
    myTextBox.ScrollToCaret();
}


文章来源: C# Preventing RichTextBox from scrolling/jumping to top