前回はMVVMを使ってみました。
Problem
Xamlを使ってみたので、色々簡単にできると思います。
なので、Timerを使ってストップウォッチを作ってみました。
ソースは https://github.com/takuya-takeuchi/Demo/tree/master/Xamarin/02_Xamarin.Forms.Portable2です。
この手の話題はエクセルソフトの田淵様のJXUGC #9 Xamarin.Forms Mvvm 実装方法 Teachathon を開催しましたで実施済みですが、あえて自分でやってみます。
課題はTimerをどうするか、ですが普通にXamarinのページにXamarin.Forms.Device.StartTimerがありました。
けど、WinFormsやWPFでお世話になったSystem.Timers.Timerとかと違います。
インスタンスを作ってそこで管理するのではなく、Staticメソッドにコールバックを渡して、指定した間隔で処理をするようです。
タイマーを停止する方法は
While the callback returns true, the timer will keep recurring.
訳:コールバックがtrueを返す間は、タイマーは繰り返し発生し続けます。
とあるので、第二引数のコールバックで不要になったらfalseを返せば良いだけのようです。
Resolution
Timerさえわかれば、あとはちょいちょい、って感じかと思ったそうでもありませんでした。
Xamlで作れるし、WPF、UWPとクラスが似ているので直感的に作れますが、細かいところが違います。
まず、WidthやHeightがReadOnlyなので、要素をおおまかなおおきさにして配置するのが面倒です。
あと、Xamlのインテリセンスが少し残念です。プロパティ要素構文でインテリセンスの推測が効かないので、最初は焦りました。
最もきついのは、Xaml構文でエラーになってもビルドが通ることです。
最初、間違えてResoueceプロパティの子要素に、下記のようにリソース要素を追加していました。
1 | <ContentPage.Resources> |
でも、これでビルドが通って、長い時間かけて起動したiPhone Simulatorで実行時エラー、となると悲しいです。
正しくは当然下記のよう。
1 | <ContentPage.Resources> |
これは改善して欲しいです。
辛いのはこれくらいですが、あとは普通です。WPFやUWPがきちんと使えればどうとでもなります。
VisiblityプロパティがIsVisibleでbool型なのはWinFormsを思い出して、(´ω`)ホッコリしました。
最終的に、
MainPage.xaml
1 | <?xml version="1.0" encoding="utf-8" ?> |
MainPageViewModel.cs
1 | using System; |
になりました。
BooleanInvertConverterとかは省略します。簡単すぎますので。
出来上がった結果がこれ。
シンプルなストップウォッチ…
Startを押せば、Stopボタンに変わり、経過時間が変化します。
が、このストップウォッチ問題があって、非常に精度が悪いです。10ms間隔がまずいのか非常に遅い。
ひょっとしたらTimerは別のAPIがあるのかもしれません。
ネイティブのAPIを直接呼ぶ方がよいか?
Conclusion
実用度と精度はともかくアプリと呼べるアプリを作ってみました。
XAMLでの開発経験があるならこれほど取っつきやすいものはないと思います。
Source Code
https://github.com/takuya-takeuchi/Demo/tree/master/Xamarin/02_Xamarin.Forms.Portable2