2016-11-18 3 views
0

Я разрабатываю приложение WPF. Мне нужен способ запускать каждые 5 секунд и выводить информацию, которую он захватывает. Я использовал разницу DateTime, чтобы решить, прошло ли 5 ​​секунд. Когда я начал запускать его, я мог видеть, что правильная информация выводится каждые 5 секунд. Однако окно приложения не появилось, и я не мог найти его значок в строке состояния. Вот мой код общественный MainWindow():WPF: выход правильный, но окно не отображается

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

Позже я обнаружил, в зависимости от того окна, я переместил этот код в других окнах будут отображаться нормально, но каждый раз, когда он переключится на окно с этим кодом, окно не будет показывать вверх. Кто-нибудь есть идеи? Заранее спасибо!

+2

Это бесконечный цикл, который навсегда блокирует конструктор MainWindow. Совершенно очевидно, что окно не появится. Выбросьте весь этот код и вместо этого используйте таймер, предпочтительнее DispatcherTimer. – Clemens

ответ

1

Clemens абсолютно прав. В текущем коде вы создаете бесконечный цикл, который не позволяет остальной программе продолжать работу.

Следующий код бесстыдно украден от WPF Tutorial.

Xaml для окна:

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

И код позади:

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

Вы заметите, что конструктор для окна создает таймер на 1 секунду. Каждую секунду метка в окне будет обновлена ​​до значения DateTime.Now.ToLongTimeString() (например, 10:30:15).

+0

Он работает !! Спасибо большое! – Lolo

+0

Пожалуйста, отметьте ответы как правильные, чтобы другие знали, что вопрос был решен. Это галочка ниже голосования (слева от ответа). – techvice

+0

Хорошо! Я отметил это! – Lolo

Смежные вопросы