This article has been localized into Czech by the community.
DispatcherTimer
Ve WinForms existuje ovládací prvek s názvem Timer, který může vykonávat akci opakovaně podle zadaného intervalu. WPF nabízí tuto možnost také, ale místo neviditelného (Timer se totiž ve skutečnosti nezobrazuje přímo ve formuláři, ale pod ním) ovládacího prvku máme ovládací prvek DispatcherTimer. Princip fungování tohoto prvku je velmi podobný. Jen s tím rozdílem, že ho nepřetáhnete jako klasickou kontrolku do formuláře, ale vytvoříte a obsluhujete ho výhradně z kódu Code-behind.
Třída DispatcherTimer funguje tak, že zadáte interval a poté se přihlásíte k odběru události Tick, která nastane pokaždé, když dojde k uplynutí tohoto intervalu. DispatcherTimer se spustí až poté, když zavoláte metodu Start() nebo nastavíte jeho vlastnost IsEnabled na hodnotu true.
Vyzkoušejme jednoduchý příklad, kde pomocí DispatcherTimer vytvoříme digitální hodiny:
<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();
}
}
}
Část XAML je velmi jednoduchá - jedná se pouze o vycentrovaný label s velkou velikostí písma, který se použije k zobrazení aktuálního času.
Code-behind je pak místo, kde se v tomto příkladu odehrává vše podstatné. V konstruktoru okna vytvoříme instanci DispatcherTimer. Nastavíme vlastnost Interval na jednu sekundu, přihlásíme se k odběru události Tick a poté spustíme samotný časovač. V události Tick jednoduše aktualizujeme label tak, aby zobrazoval aktuální čas.
DispatcherTimer může samozřejmě pracovat v různých intervalech, menších nebo mnohem větších. Můžete například chtít, aby se něco dělo každých 30 sekund nebo 5 minut - stačí pak použít některou z metod TimeSpan.From*, jako je třeba FromSeconds, FromMinutes apod. nebo vytvořit novou instanci TimeSpan, která zcela vyhovuje vašim potřebám.
Abychom ukázali, čeho je DispatcherTimer schopen, zkusme aktualizovat častěji ... Mnohem častěji!
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.FromMilliseconds(1);
timer.Tick += timer_Tick;
timer.Start();
}
void timer_Tick(object sender, EventArgs e)
{
lblTime.Content = DateTime.Now.ToString("HH:mm:ss.fff");
}
}
}
Jak vidíte, nyní žádáme DispatcherTimer, aby se spouštěl každou milisekundu! V události Tick používáme k zobrazení milisekund v prvku label tzv. vlastní řetězec formátu času. Nyní máte něco, co lze snadno použít jako stopky - stačí přidat několik tlačítek do okna formuláře a poté je nechat zavolat Stop(), Start() a Restart() metody na časovači.
Shrnutí
Existuje mnoho situací, kdy byste v daném intervalu potřebovali, aby se něco ve vaší aplikaci odehrálo, a pomocí DispatcherTimer toho lze dosáhnout poměrně snadno. Uvědomte si ale, že pokud v události Tick vytvoříte něco komplikovaného, nemělo by se to spouštět tak často, jako tomu bylo v posledním příkladu, kdy časovač tzv. tikal každou milisekundu - to by znamenalo velkou zátěž pro počítač, na kterém by běžela tato aplikace.
Uvědomte si také, že DispatcherTimer není 100% přesný za každé situace. Tick operace jsou umístěny do fronty Dispatcheru (časovač je obsluhován smyčkou událostí formuláře), takže pokud je počítač příliš vytížen, může být tato operace zpožděna. Rozhraní .NET slibuje, že událost Tick nenastane nikdy předčasně, ale nemůže slíbit, že nebude mírně zpožděna. Pro většinu případů použití je však DispatcherTimer dostatečně přesný.
Pokud potřebujete, aby váš časovač měl ve frontě vyšší prioritu, můžete nastavit DispatcherPriority zasláním jedné z hodnot na prioritu DispatcherTimeru. Další informace naleznete v tomto článku MSDN.