101 votes

La 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 vers le bas, une fois que de nouvelles données ont été écrites, elles remontent vers le haut. J'aimerais le contraire.

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

192voto

Fuex Points 6246

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();
}

26voto

DrWu Points 28

Le RichTextBox restera défilé jusqu'à la fin s'il 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 de visionneuse de journal qui a utilisé la méthode ci-dessous. Il a utilisé jusqu'à un noyau complet pour suivre. Se débarrasser de ce code et définir HideSelection sur False a réduit l'utilisation du processeur à 1-2%

 //Don't use this!
richTextBox.AppendText(text);  
richTextBox.ScrollToEnd();

24voto

123iamking Points 690

Je vais faire simple :

  • Set HideSelection bien à false

  • Utilisez la 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);
}

15voto

Prem Kumar Badri Points 409
    [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 enrichi vers le bas

-2voto

Gayan Dasanayake Points 374

Lors de l'écriture de nouvelles données, si vous utilisez AppendText() elles ne défileront pas vers le haut et resteront toujours en bas.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X