2012-10-08 306 views
3

看來,使用System.Windows.Forms.RichTextBox時,您可以使用textbox.AppendText()textbox.Text = ""向文本框中添加文本。C#防止RichTextBox滾動/跳到頂部

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和重載滾動功能,沒有工作這麼好。

有沒有人知道如何一勞永逸地停止滾動文本框?

它不應該走到最前面,也不會走到最前面,當然也不會當前選擇,而是保持目前的狀態。

回答

1

在此之後:

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

只需添加這兩條線:

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

快樂編碼

+0

這實際上會滾動到底部,如果集中並且不重點。 – user1137183

0

然後,如果我沒有得到你,你應該試試這個:

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

當我嘗試一下,它就像你想要的那樣工作。

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

這並不符合您的想法。它是賦值,它完全替換了Text屬性。 + =操作是方便的語法糖,但執行是

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

RichTextBox中沒有努力比較舊文本與新文本以尋找可能的匹配,可以保持在相同的插入位置的實際代碼地點。它因此將插入符號移回文本中的第一行。這反過來導致它回滾。跳。

你一定要避免這種代碼,它是非常昂貴的。如果您嘗試對文本進行格式設置,您會感到不愉快,您將失去格式。而是贊成AppendText()方法追加文本,SelectionText屬性插入文本(在更改SelectionStart屬性之後)。不僅速度的好處而且不滾動。

+1

我明白了,我該如何防止AppendText()滾動? AppendText()讓我再次滾動到底部。由於除了選擇之外無法獲取用戶的當前位置,因此我無法向前滾動,除非阻止它首先滾動。 – user1137183

+0

@ user1137183:我看不到問題。在富文本框中選擇開始是光標位置。提前保存並在寫入後恢復它? – Nyerguds

0

我不得不來實現類似的東西,所以我想分享...

當:

  • 用戶聚焦:沒有滾動
  • 沒有聚焦用戶:滾動到底

我拿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(); 
} 
相關問題