3

看来,当使用 a 时,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和覆盖效果不佳的滚动功能。

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

它不应该到顶部,也不应该到底部,当然也不应该到当前选择,而应该停留在当前位置。

4

4 回答 4

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

这并不像你认为的那样。它是一个assignment,它完全取代了 Text 属性。+= 运算符是方便的语法糖,但实际执行的代码是

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

RichTextBox 不努力将旧文本与新文本进行比较,以寻找可以将插入符号位置保持在同一位置的可能匹配项。因此,它会将插入符号移回文本的第一行。这反过来又导致它向后滚动。跳。

你肯定想避免这种代码,它非常昂贵。如果你努力格式化文本,你会失去格式。而是倾向于 AppendText() 方法来追加文本和 SelectionText 属性来插入文本(在更改 SelectionStart 属性之后)。不仅有速度的好处,而且也没有滚动。

于 2012-10-08T19:15:15.180 回答
1

在这之后:

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

只需添加这两行:

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

快乐编码

于 2012-10-08T18:10:43.987 回答
1

我必须实现类似的目标,所以我想分享...

什么时候:

  • 以用户为中心:无滚动
  • 用户不关注:滚动到底部

我接受了 Hans Passant 关于使用 AppendText() 和 SelectionStart 属性的建议。这是我的代码的样子:

int caretPosition = myTextBox.SelectionStart;

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

if (myTextBox.Focused)
{
    myTextBox.Select(caretPosition, 0);
    myTextBox.ScrollToCaret();
}
于 2015-01-04T16:31:38.547 回答
0

Then, if I got you correctly, you should try this:

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

When I try it, it works like you want it to.

于 2012-10-08T18:49:00.877 回答