MVVMっぽくXamarin.Formsアプリ作ってみました。その3
前回からの続きです。
MVVMっぽくXamarin.Formsアプリ作ってみました。その1 - 眠いしお腹すいたし(´・ω・`)
MVVMっぽくXamarin.Formsアプリ作ってみました。その2 - 眠いしお腹すいたし(´・ω・`)
ほんとに細切れでごめんなさい。
View
XAMLです。Bindingします。
ReactivePropertyをBindingすると時はProperty名.Valueとなるので注意です。
今回のサンプルでは作成していませんがUserControlを作ったりCutomRenderを作成したりする事は結構あります。
Xamarin.Forms2.1からはEffectsが追加されていますが試してないです。
WPFなどではIllustratorとかPhotoShopなどからXAMLを生成してコントロールを作ったりするのですが、Xamarin.Formsの見た目は絵を多めに使ったりしました。
View回りに関してはデザインとどのように連携するかなどのノウハウがもっとほしいなぁって思ってます。
Viewの機構的には色々と仕組みはありますが
あとはBehavior、WPFとかやってきてる人にはおなじみですよね。たぶん。
例えばボタンがクリックされた時にボタンのCommandプロパティにICommandをBindingしているとICommandがExecuteされます。
Xamarin.Formsでは無いですが、ボタンがマウスオーバーされたときにコマンドを実行したいような時にButtonを継承して新しいコントロールを作成するのでなくButtonにアタッチするような形でコマンドをバインドできる仕組みを作ることができたりもします。
またサンプルにはありませんがローカライズも正解がなくて悩みます。
前回も触れましたがページ遷移は悩みます。
実際の案件ではPageManagerクラスを作成してMessagingCenterで繋いで管理する形をとっていました。
PageManagerではコンテナーを使ってController、View、ViewModelのインスタンス管理とページ遷移を管理していました。
Navigation
Xamarin.Formsの基本的なページ遷移機構になります。
INavigation Interface - Xamarin
こんな感じのインターフェースを使ってページ遷移を行います。
NavigationはVisualElementクラスのプロパティです。
VisualElementを継承しているPageクラスはもちろんButtonにもNavigationはついています。
ある意味で広範囲からページ遷移を行うことができたりします。
ただNavigationをプログラムから呼び出さなくてもページ遷移を行うことができたりします。
それにはMultiPageを継承したPageを使います。
クラス関係はこちらのURLにある画像がわかりやすいです。
Introducing Calcium for Xamarin.Forms - CodeProject
MultiPageはabstractであり実装はCarouselPageとTabbedPageが用意されています。
この二つはIList
要するにChildrenにページをセットしておけば、それらのページ間の移動をUI操作に応じて勝手にやってくれるんです。
TabbedPageはタブでCarouselPage*1はスワイプでページ遷移を行うことができます。
イメージとしてはINavigationを使用したページ遷移はスタック・縦方向のページ遷移でMultiPageを使用したページ遷移は横方向のページ遷移になります。
XamarinFormsSampleStopWatch/App.cs at master · yuka1984/XamarinFormsSampleStopWatch · GitHub
今回のサンプルではStopwatchPageとSaveListPageはTabbedPageで横方向のページ遷移とし、SavePageへの移動はNavigationを使用して縦方向のページ遷移を行っています。
注意する点としてMultiPageのページ遷移は早いけどNavigationのページ遷移は早くないということがあります。
今回程度の画面であればほとんど気にならないレベルなのですがViewが複雑化したりBindingが増えたりするとNavigationにプッシュしたりした時の動作が重くなりユーザ操作がスムーズでなくなります。
この事はアプリを作るうえでユーザ体験をよくするためにも凄く大切なのでその辺を踏まえて設計を行ったほうが良いと思います。
今回はここまで。あんまりプログラムの解説してないですね(´・ω・`)
*1:CarouselPageは非推奨になるらしいです。