2016-11-18 2 views
0

Ich entwickle eine WPF-Anwendung. Ich brauche eine Methode, die alle 5 Sekunden ausgeführt wird und die erfassten Informationen ausgibt. Ich benutzte den Unterschied von DateTime, um zu entscheiden, ob 5 Sekunden vergangen sind. Als ich anfing zu laufen, konnte ich sehen, dass die korrekten Informationen alle 5 Sekunden ausgegeben wurden. Das Fenster der App wurde jedoch nicht angezeigt. Außerdem konnte ich das Symbol in der Statusleiste nicht finden. Hier ist mein Code öffentlich Mainwindow():WPF: Die Ausgabe ist korrekt, aber das Fenster wird nicht angezeigt

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

Später fand ich je nachdem, was Fenster ich diesen Code zog in anderen Fenstern normalerweise erscheinen, aber jedes Mal, wenn es mit diesem Code in das Fenster wechseln, würde das Fenster nicht mehr anzeigen oben. Hat jemand eine Idee? Danke im Voraus!

+2

Dies ist eine Endlosschleife, die den MainWindow-Konstruktor für immer blockiert. Ganz offensichtlich wird das Fenster nicht angezeigt. Wirf den ganzen Code weg und benutze stattdessen einen Timer, vorzugsweise einen DispatcherTimer. – Clemens

Antwort

1

Clemens ist absolut richtig. Der aktuelle Code erzeugt eine Endlosschleife, die es dem Rest des Programms nicht erlaubt weiterzumachen.

Der folgende Code wird schamlos aus WPF Tutorial gestohlen.

XAML für Fenster:

<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> 

Und der Code hinter:

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

Sie werden feststellen, dass der Konstruktor für die Fenster einen Timer für 1 Sekunde erzeugt. Jede Sekunde wird die Beschriftung auf dem Fenster auf den Wert für DateTime.Now.ToLongTimeString() (z. B. 10:30:15) aktualisiert.

+0

Es funktioniert !! Vielen Dank !!! – Lolo

+0

Bitte markieren Sie die Antworten als richtig, damit andere wissen, dass die Frage gelöst wurde. Es ist das Häkchen unter der Abstimmung (auf der linken Seite der Antwort). – techvice

+0

Okay! Ich habe es markiert! – Lolo

Verwandte Themen