2009-12-13 4 views
3

Notre application démarre plusieurs processus d'arrière-plan et place leur sortie dans TextBoxes, chacun dans un TabItem distinct dans un TabControl. Je veux que les zones de texte pour faire défiler automatiquement pour afficher la dernière ligne de sortie, de sorte que dans la fonction de traitement des données qui ajoute la ligne de sortie/erreur à la zone de texte, je l'appelle également TextBox.ScrollToEnd():TextBox.ScrollToEnd ne fonctionne pas lorsque la zone de texte est dans un onglet non actif

void OnServerProcessOutputDataReceived(object sender, DataReceivedEventArgs e) 
{ 
    if (e.Data != null) 
    { 
     Dispatcher.Invoke(new Action(() => 
      { 
       TextBox tb = getServerProcessOutputTextBox(sender); 
       if (tb != null) 
       { 
        tb.AppendText(e.Data + Environment.NewLine); 
        tb.ScrollToEnd(); 
       } 
      })); 
    } 
} 

Cela fonctionne super pour le TextBox dans l'onglet actif, mais quand je passe à un autre onglet, je vois qu'il n'a pas été fait défiler jusqu'à la fin.

Est-ce un problème connu? Y a-t-il un moyen de le réparer?

+0

Voici une réponse pour savoir comment faire ceci: http://stackoverflow.com/questions/4055720/scrolling-to-the-end-of-a-single-line-wpf-textbox –

Répondre

10

Régler le caretIndex:

if (tb != null) 
    { 
     tb.AppendText(e.Data + Environment.NewLine); 
     tb.CaretIndex = tb.Text.Length; 
     tb.ScrollToEnd(); 
    } 
+3

Cette solution ne fonctionnerait pas à moins que le TextBox n'ait le focus: tb.Focus(). – Fueled

Questions connexes