2013-06-19 10 views
1

Dans mon application Windows 8, je souhaite afficher l'heure actuelle dans un élément TextBlock. La valeur de temps devrait être mise à jour toutes les secondes. Le code suivant fonctionne bien, mais je pense que ce n'est pas exactement la solution idéale. Alors, y a-t-il une meilleure façon de faire cela?Comment lier DateTime.Now à TextBlock?

public class Clock : Common.BindableBase { 
    private string _time; 
    public string Time { 
     get { return _time; } 
     set { SetProperty<string>(ref _time, value); } 
    } 
} 

private void startPeriodicTimer() { 
    if (PeriodicTimer == null) { 
     TimeSpan period = TimeSpan.FromSeconds(1); 

     PeriodicTimer = ThreadPoolTimer.CreatePeriodicTimer((source) => { 

      Dispatcher.RunAsync(CoreDispatcherPriority.Normal, 
       () => { 
        DateTime time = DateTime.Now; 
        clock.Time = string.Format("{0:HH:mm:ss tt}", time); 
        [...] 
       }); 

     }, period); 
    } 
} 

Dans la méthode LoadState:

clock = new Clock(); 
clock.Time = string.Format("{0:HH:mm:ss tt}", DateTime.Now); 
currentTime.DataContext = clock; 
startPeriodicTimer(); 
+1

Utilisez une minuterie ..... –

+0

Vous devriez interroger plus souvent. Si vous le faites une fois par seconde, vous pouvez constater que l'horloge semble bégayer ou sauter. En raison de la précision de l'horloge et des problèmes de synchronisation du processeur, "une fois par seconde" n'est pas garanti pour fonctionner à * exactement * 1 seconde d'intervalle. Il se peut qu'il soit à quelques millisecondes de distance dans les deux sens. Réglez donc une valeur de 500 ms et cela sera beaucoup plus fluide. –

Répondre

0

WinRT a DispatcherTimer classe. Tu peux l'utiliser.

XAML

<Page.Resources> 
    <local:Ticker x:Key="ticker" /> 
</Page.Resources> 

<TextBlock Text="{Binding Source={StaticResource ticker}, Path=Now}" FontSize="20"/> 

C#

public class Ticker : INotifyPropertyChanged 
{ 
    public Ticker() 
    { 
     DispatcherTimer timer = new DispatcherTimer(); 
     timer.Interval = TimeSpan.FromSeconds(1); 
     timer.Tick += timer_Tick; 
     timer.Start(); 
    } 

    void timer_Tick(object sender, object e) 
    { 
     if (PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs("Now")); 
    } 

    public string Now 
    { 
     get { return string.Format("{0:HH:mm:ss tt}", DateTime.Now); } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
} 
1

Vous pouvez utiliser une minuterie.

var timer = new Timer { Interval = 1000 }; 
timer.Elapsed += (sender, args) => NotifyPropertyChanged("Now"); 
timer.Start(); 

Et de notifier une propriété chaque seconde.

public DateTime Now 
{ 
    get { return DateTime.Now; } 
} 
0

Comment je l'ai fait dans ma demande en utilisant la minuterie

 private void dispatcherTimer_Tick(object sender, EventArgs e) 
     { 
      TxtHour.Text = DateTime.Now.ToString("HH:mm:ss"); 
     } 
private void MainWindow_OnLoad(object sender, RoutedEventArgs e) 
     { 
      System.Windows.Threading.DispatcherTimer dispatcherTimer = new System.Windows.Threading.DispatcherTimer(); 
      dispatcherTimer.Tick += new EventHandler(dispatcherTimer_Tick); 
      dispatcherTimer.Interval = new TimeSpan(0, 0, 1); 
      dispatcherTimer.Start(); 
      TxtDate.Text = DateTime.Now.Date.ToShortDateString(); 
     } 
Questions connexes