Применить таймер в Xamarin Forms можно разными способами. Первый способ представляет использование метода Device.StartTimer(), который определен в пространстве имен Xamarin.Forms. Он имеет следующее определение:
Device.StartTimer(TimeSpan interval, Func<bool> callback);
Первый параметр задает временный интервал, через который будет действовать метод из второго параметра - функция обратного вызова. Причем эта функция должна возвращать булевое значение: true - если надо, чтобы таймер продолжал выполнение, и false, если надо, чтобы таймер остановился. Например:
using System; using Xamarin.Forms; namespace HelloApp { public partial class MainPage : ContentPage { Button timerButton; bool alive = true; public MainPage() { timerButton = new Button { VerticalOptions = LayoutOptions.Center, HorizontalOptions = LayoutOptions.Center, FontSize = Device.GetNamedSize(NamedSize.Large, typeof(Button)) }; timerButton.Clicked += TimerButton_Clicked; Content = timerButton; Device.StartTimer(TimeSpan.FromSeconds(1), OnTimerTick); } private bool OnTimerTick() { timerButton.Text = DateTime.Now.ToString("T"); return alive; } private void TimerButton_Clicked(object sender, EventArgs e) { if(alive==true) { alive = false; } else { alive = true; Device.StartTimer(TimeSpan.FromSeconds(1), OnTimerTick); } } } }
Здесь определена кнопка, на котороую выводится текущее время. Для вывода времени запущен таймер, причем он срабатывает раз в секунду
(TimeSpan.FromSeconds(1)
). По таймеру срабатывает метод OnTimerTick, который возвращает значение переменной alive. Через нажатие на кнопку мы можем
проконтроллировать значение этой переменной и тем самым остановить или снова запустить таймер.
Еще одну форму таймера представляет симуляция таймера с помощью временной задержки Task.Delay():
using System; using System.Threading.Tasks; using Xamarin.Forms; namespace HelloApp { public partial class MainPage : ContentPage { Button timerButton; bool alive = true; public MainPage() { timerButton = new Button { VerticalOptions = LayoutOptions.Center, HorizontalOptions = LayoutOptions.Center, FontSize = Device.GetNamedSize(NamedSize.Large, typeof(Button)) }; timerButton.Clicked += TimerButton_Clicked; Content = timerButton; DisplayTime(); } private async void DisplayTime() { while (alive) { timerButton.Text = DateTime.Now.ToString("T"); await Task.Delay(1000); } } private void TimerButton_Clicked(object sender, EventArgs e) { if(alive==true) { alive = false; } else { alive = true; DisplayTime(); } } } }
Этот практически аналогичный пример за тем исключением, что тут явным образом запускается асинхронный метод DisplayTime(), который отрабатывает во вторичном потоке. Поэтому, несмотря на то, что он запускается в конструкторе, после завершения конструктора он продолжит работу.