.Multiline プロパティが true に設定されたテキスト ボックスがあります。定期的に、新しいテキスト行を追加しています。新しい行が追加されるたびに、テキスト ボックスが最下部のエントリ (最新のエントリ) に自動的にスクロールされるようにしたいと思います。これを実現するにはどうすればよいでしょうか。
ベストアンサー1
定期的に、新しいテキスト行を追加しています。新しい行が追加されるたびに、テキストボックスが最下部のエントリ (最新のエントリ) まで自動的にスクロールするようにしたいと思います。
使用する場合はTextBox.AppendText(string text)
、新しく追加されたテキストの最後まで自動的にスクロールします。ループ内で呼び出すと、スクロールバーがちらつくのを回避できます。
また、プロパティに連結するよりも桁違いに高速です.Text
。ただし、これは呼び出す頻度によって異なる可能性があります。私はタイトなループでテストしていました。
テキストボックスが表示される前に呼び出された場合、またはテキストボックスが表示されていない場合(たとえば、TabPanel の別のタブ内)は、スクロールしません。TextBox.AppendText() が自動スクロールしないユーザーがテキスト ボックスを見ることができない場合に自動スクロールが必要かどうかによって、これが重要になる場合とそうでない場合があります。
この場合、他の回答の代替方法も機能しないようです。回避策の 1 つは、イベントで追加のスクロールを実行することですVisibleChanged
。
textBox.VisibleChanged += (sender, e) =>
{
if (textBox.Visible)
{
textBox.SelectionStart = textBox.TextLength;
textBox.ScrollToCaret();
}
};
内部的には、AppendText
次のようになります:
textBox.Select(textBox.TextLength + 1, 0);
textBox.SelectedText = textToAppend;
しかし、手動で行う理由はないはずです。
(自分で逆コンパイルすると、おそらくより効率的な内部メソッドがいくつか使用されており、小さな特殊なケースがあるように見えることがわかります。)