2016-11-18 3 views
0

Je développe une application WPF. J'ai besoin d'une méthode pour exécuter toutes les 5 secondes et sortir les informations qu'il capture. J'ai utilisé la différence de DateTime pour décider si 5 secondes sont passées. Quand j'ai commencé à l'exécuter, je pouvais voir les informations correctes sont sorties toutes les 5 secondes. Cependant, la fenêtre de l'application n'apparaissait pas, et je ne pouvais pas non plus trouver son icône dans la barre d'état. Voici mon code MainWindow public():WPF: La sortie est correcte mais la fenêtre n'apparaît pas

InitializeComponent();    
    DateTime now; 
     DateTime _lastTime5SecondsHadPassed = DateTime.Now; ; 
     TimeSpan elapsed; 
     do 
     { 
      now = DateTime.Now; 
      elapsed = now - _lastTime5SecondsHadPassed; 
      if (elapsed.Seconds >= 10) 
      { 
       title = GetActiveWindowTitle(); 
       Trace.WriteLine(title); 
       _lastTime5SecondsHadPassed = DateTime.Now; 
      } 

     } while (true); 

Plus tard, je trouve fenêtre selon je me suis déplacé le code dans d'autres fenêtres semblent normalement, mais à chaque fois quand il passer à la fenêtre avec ce code, la fenêtre ne montreraient pas en haut Est-ce que quelqu'un a une idée? Merci d'avance!

+2

Ceci est une boucle sans fin qui bloque le constructeur MainWindow pour toujours. Il est évident que la fenêtre ne s'affichera pas. Jetez tout ce code, et utilisez minuterie à la place, de préférence un DispatcherTimer. – Clemens

Répondre

1

Clemens a absolument raison. Le code actuel que vous produisez une boucle sans fin qui ne permet pas au reste du programme de continuer.

Le code suivant est volé sans vergogne de WPF Tutorial.

Xaml pour fenêtre:

<Window x:Class="WpfTutorialSamples.Misc.DispatcherTimerSample" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="DispatcherTimerSample" Height="150" Width="250"> 
    <Grid> 
     <Label Name="lblTime" FontSize="48" HorizontalAlignment="Center" VerticalAlignment="Center" /> 
    </Grid> 
</Window> 

Et le code derrière:

using System; 
using System.Windows; 
using System.Windows.Threading; 

namespace WpfTutorialSamples.Misc 
{ 
     public partial class DispatcherTimerSample : Window 
     { 
       public DispatcherTimerSample() 
       { 
         InitializeComponent(); 
         DispatcherTimer timer = new DispatcherTimer(); 
         timer.Interval = TimeSpan.FromSeconds(1); 
         timer.Tick += timer_Tick; 
         timer.Start(); 
       } 

       void timer_Tick(object sender, EventArgs e) 
       { 
         lblTime.Content = DateTime.Now.ToLongTimeString(); 
       } 
     } 
} 

Vous remarquerez que le constructeur de la fenêtre crée une minuterie pour 1 seconde. Chaque seconde, l'étiquette sur la fenêtre sera mise à jour à la valeur pour DateTime.Now.ToLongTimeString() (par exemple 10:30:15).

+0

Ça marche !! Merci beaucoup !!! – Lolo

+0

Veuillez marquer les réponses comme correctes afin que les autres sachent que la question a été résolue. C'est la coche en dessous du vote (à gauche de la réponse). – techvice

+0

Okay! Je l'ai marqué! – Lolo