web-dev-qa-db-fra.com

Zone de texte enrichi défile vers le bas lorsque de nouvelles données y sont écrites

Mon programme appelle Java, puis redirige stdout vers un RichTextBox. Mon problème est que la barre de défilement verticale reste toujours en haut de la boîte à chaque fois que des données sont écrites.

Même si vous faites défiler l'écran vers le bas, une fois que de nouvelles données ont été écrites, elles iront au sommet. Je voudrais le contraire.

Ainsi, lorsque de nouvelles données sont écrites, elles restent en bas. Comment puis-je faire ceci?

66
user1158745

Oui, vous pouvez utiliser la méthode ScrollToCaret() :

// bind this method to its TextChanged event handler:
// richTextBox.TextChanged += richTextBox_TextChanged;
private void richTextBox_TextChanged(object sender, EventArgs e) {
   // set the current caret position to the end
   richTextBox.SelectionStart = richTextBox.Text.Length;
   // scroll it automatically
   richTextBox.ScrollToCaret();
}
133
Omar

La RichTextBox continuera à défiler jusqu'à la fin si elle a le focus et que vous utilisez AppendText pour ajouter les informations. Si vous définissez HideSelection sur False, il conservera sa sélection lorsqu'il perd le focus et restera en défilement automatique.

J'ai conçu une interface graphique Log Viewer utilisant la méthode ci-dessous. Il a utilisé jusqu'à un noyau complet de suivre. La suppression de ce code et la définition de HideSelection sur False ont réduit l’utilisation de la CPU à 1-2%

//Don't use this!
richTextBox.AppendText(text);  
richTextBox.ScrollToEnd();
14
DrWu
    [DllImport("user32.dll", CharSet = CharSet.Auto)]
    private static extern IntPtr SendMessage(IntPtr hWnd, int wMsg, IntPtr wParam, IntPtr lParam);
    private const int WM_VSCROLL = 277;
    private const int SB_PAGEBOTTOM = 7;

    internal static void ScrollToBottom(RichTextBox richTextBox)
    {
        SendMessage(richTextBox.Handle, WM_VSCROLL, (IntPtr)SB_PAGEBOTTOM, IntPtr.Zero);
        richTextBox.SelectionStart = richTextBox.Text.Length;
    }

ScrollToBottom (richTextBox);

en utilisant la méthode ci-dessus, vous pouvez faire défiler la zone de texte riche vers le bas

6

Je vais rester simple:

  • Définissez la propriété HideSelection sur false

  • Utilisez la méthode AppendText() pour ajouter du texte à RichTextBox.

Code:

RichTextBox rtbTest;

void InitRichTextBox()
{
    //Init rtbTest...

    rtbTest.HideSelection = false;//Hide selection so that AppendText will auto scroll to the end
}

void AddText(string txt)
{
    rtbTest.AppendText(txt);
}
3
123iamking