2010-11-17 4 views
4

J'ai ce code:WPF pas la mise à jour en cours textbox tout

void wait(int ms) 
{ 
    System.Threading.Thread.Sleep(ms); 
} 

private void button1_Click(object sender, RoutedEventArgs e) 
{ 
    info.Text = "step 1"; 
    wait(1000); 
    info.Text = "step 2"; 
    wait(1000); 
    info.Text = "step 3"; 
    wait(1000); 
    info.Text = "step 4"; 
    wait(1000); 
} 

Et Le problème est que TextBox.Text est mis à jour après tout vide button1_Click terminé. Il est pas mis à jour ON AIR :(

S'il vous plaît, Comment faire?

Répondre

9

Il suffit de le faire.

private void button1_Click(object sender, RoutedEventArgs e) 
    { 
     ThreadPool.QueueUserWorkItem((o) => 
      { 
       Dispatcher.Invoke((Action) (() => info.Text = "step 1")); 
       wait(1000); 
       Dispatcher.Invoke((Action) (() => info.Text = "step 2")); 
       wait(1000); 
       Dispatcher.Invoke((Action) (() => info.Text = "step 3")); 
       wait(1000); 
       Dispatcher.Invoke((Action) (() => info.Text = "step 4")); 
       wait(1000); 
      }); 
    } 
+0

grand, cela fonctionne merci solution élégante – DefinitionHigh

+1

Ce serait bien si vous pouviez ajouter pourquoi la valeur de textbox n'est pas mise à jour sur l'air et ce que fait exactement votre solution – jklingler

+0

L'ordre de la chaîne de texte à ajouter n'est pas garanti dans cette approche, par exemple "step4" pourrait être ajouté avant "step1" – igorGIS

3

Le fil de guì ne rafraîchir que la méthode retourne button1_Click. Voilà pourquoi vous ne voyez que la dernière valeur. Vous devez mettre longtemps méthodes en appels asynchrones ou fils d'utilisation.

0

la mesure/organiser (et donc le rendu) se passe de façon asynchrone, si vous voulez forcer l'écran à jour, vous aurez alors besoin d'appeler UpdateLayout.

+0

même résultat :(quand j'ai changé le code pour info.Text = "Étape 1"; info.UpdateLayout(); attente (1000)! – DefinitionHigh

-1

si vous avez essayé un DispatcherFrame pour simuler les formes que DoEvents accomplirait:

Vous devrez peut-être inclure System.Security.Permissions et System.Windows.Threading. Après cela pplace un appel à DoEvents() après chacun de vos dortoirs et vous obtenez le résultat souhaité.

[SecurityPermissionAttribute(SecurityAction.Demand, Flags = SecurityPermissionFlag.UnmanagedCode)] 
public void DoEvents() 
{ 
    DispatcherFrame frame = new DispatcherFrame(); 
    Dispatcher.CurrentDispatcher.BeginInvoke(DispatcherPriority.Background, 
     new DispatcherOperationCallback(ExitFrame), frame); 
    Dispatcher.PushFrame(frame); 
} 

public object ExitFrame(object f) 
{ 
    ((DispatcherFrame)f).Continue = false; 

    return null; 
} 

Lien vers l'article MSDN: http://msdn.microsoft.com/en-us/library/system.windows.threading.dispatcher.pushframe.aspx

Questions connexes