RichTextBoxコントロールは、選択範囲が非表示になっていない場合、現在の選択範囲に自動的にスクロールします。 RichTextBox.AppendText()は、テキストを追加するだけでなく、現在の選択を変更するため、間接的に「自動スクロール」動作をトリガーします。 RichTextBox.HideSelectionがtrueに設定されている場合、コントロールにフォーカスがないときは選択が非表示になります。ここで説明した動作について説明します。ここでは、ユーザーがコントロール内をクリックしたときにのみ自動スクロールが発生します。 (Windowsメッセージを介して)
- バックアップ初期選択
- 非フォーカス制御
- 隠す選択:これを防ぐには を(それにより焦点を当てる与える)は、次の追加のテキストを行う必要があります
- のappendText
- は
- 再表示選択
- リフォーカス制御を初期選択を復元
また、選択範囲がテキストの最後にあるかどうかを確認し、自動スクロール動作が許可されている場合は許可することもできます。これは基本的にVisual Studioの出力ウィンドウの動作をエミュレートします。たとえば:
[System.Runtime.InteropServices.DllImport("user32.dll")]
static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, Int32 wParam, Int32 lParam);
const int WM_USER = 0x400;
const int EM_HIDESELECTION = WM_USER + 63;
void OnAppend(string text)
{
bool focused = richTextBox1.Focused;
//backup initial selection
int selection = richTextBox1.SelectionStart;
int length = richTextBox1.SelectionLength;
//allow autoscroll if selection is at end of text
bool autoscroll = (selection==richTextBox1.Text.Length);
if (!autoscroll)
{
//shift focus from RichTextBox to some other control
if (focused) textBox1.Focus();
//hide selection
SendMessage(richTextBox1.Handle, EM_HIDESELECTION, 1, 0);
}
richTextBox1.AppendText(text);
if (!autoscroll)
{
//restore initial selection
richTextBox1.SelectionStart = selection;
richTextBox1.SelectionLength = length;
//unhide selection
SendMessage(richTextBox1.Handle, EM_HIDESELECTION, 0, 0);
//restore focus to RichTextBox
if(focused) richTextBox1.Focus();
}
}
あなたのソリューションは魅力的に機能します!私は、RichTextBoxがフォーマット変更を行った後にスクロールするのを防ぐため、他にも多くのアプローチを試みました。これが働いたのは唯一のものでした。それは最初は巻き込まれたようでしたが、それは働いた:) –