Xamarin.Forms Timer Xamarin Visual Studio

在 Xamarin.Forms 當中直接製作Timer …

James Tsai 2017/07/31 18:25:42
2702

主題

Xamarin.Forms 當中直接製作Timer

文章簡介

在開發應用程式時,多少都可能需要用到 Timer 來協助處理應用程式的一些計時問題,雖然在 Xamarin 當中有支援System.Threading.Timer,但因為某些特殊原因在 Xamarin.Forms PCL 專案是沒有辦法使用。若要在Xamarin.Forms 當中要製作 Timer 的效果該怎辦呢?!。在本文章中,將會一步步來完成。

作者:

James Tsai

版本/產出日期:

V1.0/2017.7.31



1. 前言


Xamarin.Forms 確實在製作跨平台 App 有很大的優勢在,但是常常會遇到一些因為各平台差異而無法直接在 Xamarin.Forms 當中直接處理的問題,所以必須常常使用Customer Renderer 或是 DependencyService 來處理各平台的問題。而本篇文章要來討論一個本來可能需要用 DependencyService來處理的 Timer 問題,透過直接讓Xamarin.Forms 自己就能處理的小技巧。


2. 環境準備


Visual Studio 2015/2017

Visual Studio for Mac



3. 本文


前置準備


Xamarin.Forms 專案準備:

開始之前請Visual Studio當中建立一個Xamairn.Forms的專案,並且選擇使用可攜式類別庫。



並且在該專案當中所預設建立MainPage.xaml 當中先設計一下畫面,利用StackLayout來包覆兩個Button跟原本應該就預設存在的Label(紅色實線框,上方的紅色虛線框是為了iOS的畫面呈現時不要跟status bar重疊到),並且幫這兩個Button設定文字顯示以及設計 Clicked事件,Label設定文字大小跟名稱。




Preview的結果如下:




Xamarin.Forms 當中設計Timer


接著Xamarin.Forms App1(可攜式)的專案當中,建立一個新的類別。


並取名叫做MyTimer,完成後就新增。



建立完成後我們要開始來針對MyTimer這個類別設計我們的Timer程式。其實能直接在Xamarin.Forms當中設計Timer,主要還是仰賴Xamarin.Forms.Device類別底下有提供一個StartTimer的方法。

(Ref: https://developer.xamarin.com/api/member/Xamarin.Forms.Device.StartTimer/p/System.TimeSpan/System.Func%7BSystem.Boolean%7D/ )

但是Xamarin.Forms.Device類別底下提供的這個StartTimer方法,只能單純的設定interval跟一個Func,沒辦法讓我們隨意的開關,因此在透過一些設計來達成我們想要隨意開關的Timer

首先,我們現在剛剛所建立的MyTimer 類別當中,設計三個欄位(紅色實線框所示)以及建立一個建構方法(紅色虛線框所示)




並透過建構方法的參數DI相關物件給欄位。

再來接著MyTimer的這個類別中設計兩個公開方法 Start Stop




Start 這個方法當中,撰寫以下紅色框中的程式碼:





Stop 這個方法當中,撰寫以下紅色框中的程式碼:






Xamarin.Forms 當中使用Timer


接著我們打開MainPage.xaml.cs,如果沒意外應該會如下圖的呈現





接著MainPage.xaml.cs當中建立一個 _myTimer _count的欄位,並且在MainPage建構方法當中設MyTimer的物件在這邊我們設定每秒鐘執行在MyTimer的第二個參數所注入的Action 一次,讓DisplayLabel的文字會數數字。





而按鈕的事件程式碼就相對簡單,只要呼叫 _myTimer StartStop的方法即可。





接著我們選擇任一個平台(AndroidiOSUWP)來來執行看看吧!

點下 StartTimer後,Timer就會開始計數DisplayLabel的文字就會根據Timer計數的數字改變,直到點選StopTimer


Android:




iOS:




UWP:



上就是Xamairn.Forms上直接做到Timer的效果


4. 參考來源


Xamarin.Forms.Device.StartTimer Method:
https://developer.xamarin.com/api/member/Xamarin.Forms.Device.StartTimer/p/System.TimeSpan/System.Func%7BSystem.Boolean%7D/

Xamarin Forms Timer:
https://xamarinhelp.com/xamarin-forms-timer/

How can I stop Device.StartTimer?:
https://forums.xamarin.com/discussion/49492/how-can-i-stop-device-starttimer

James Tsai