3

を使用する場合、またはテキストボックスにテキストを追加するために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;

それはあなたが思っていることをしません。これは割り当てであり、Text プロパティを完全に置き換えます。+= 演算子は便利なシンタックス シュガーですが、実際に実行されるコードは次のとおりです。

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

RichTextBox は、古いテキストと新しいテキストを比較して、キャレットの位置を同じ場所に維持できる可能性のある一致を探す努力をしません。したがって、キャレットをテキストの最初の行に戻します。これにより、スクロールバックが発生します。ジャンプ。

この種のコードは絶対に避けたいと思います。非常にコストがかかります。また、テキストの書式を設定しようとすると、書式が失われてしまいます。代わりに、AppendText() メソッドを使用してテキストを追加し、SelectionText プロパティを使用してテキストを挿入します (SelectionStart プロパティを変更した後)。速度だけでなくスクロールもないという利点があります。

于 2012-10-08T19:15:15.180 に答える
1

私は似たようなことを達成しなければならなかったので、共有したかった...

いつ:

  • ユーザーがフォーカス: スクロールなし
  • ユーザーが集中していない: 一番下までスクロール

AppendText() と SelectionStart プロパティの使用について、Hans Passant のアドバイスを受けました。私のコードは次のようになります。

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 に答える
1

この後:

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

この2行を追加するだけです:

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

ハッピーコーディング

于 2012-10-08T18:10:43.987 に答える
0

次に、私が正しく理解している場合は、次のことを試してください。

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

試してみると、思い通りに動作します。

于 2012-10-08T18:49:00.877 に答える