(Xamarin.Forms)TabbedPage
(以前の記事)
Xamarin.Formsの画面遷移 - Makopy'5 La6
特に理解しておくべき画面遷移として、下記を挙げています。
- Hierarchical Navigation
- Modal Pages
- TabbedPage
これまで、
- Hierarchical Navigation
- Modal Pages
にスポットを当ててきました。
今回はTabbedPageにスポットを当ててみたいと思います。
TabbedPageのポイント
Xamarinでのアプリ開発は日が浅いのであまり実戦事例が足りていませんが…。
スマホアプリ開発として見ると、実戦の開発では、Tabによる画面(機能)の切り替えは遭遇率が高いです。
画面(機能)が多岐に渡る場合はMaster-Detail Pageもありえますが。
例のごとく、ベーシックな知識は公式のDevelopersガイドから得るのが一番です。
developer.xamarin.com
画面管理
- TabbedPageの子要素(
Children
)にPageを設定する ItemsSource
,ItemTemplate
を使用した画面設定も可能
ItemsSource
, ItemTemplate
を使う方法は同一構成の複数画面が前提なので、個人的にはCarousel Pageなイメージです。
また、
「機能的に異なるいくつかの画面 + 設定画面」
みたいなのが、Tabを使ったアプリには多い気がします。
そのような場合は画面単位に実装を担当する可能性が高く、基本的にはChildren
にPageを設定するような実装をまずは押さえておくべきだと思います。
Tab構成に関する注意点
- 子要素は
NavigationPage
,ContentPage
のインスタンスで構成されるべき - 含まれる子要素が多すぎるとパフォーマンスが影響を受ける可能性がある
TabbedPage
をNavigationPage
に配置するのは非推奨- iOSでは
UITabBarController
がUINavigationController
のラッパーとして動作するため
- iOSでは
UI関連
Tab表示位置に関する悩み…
上述の
「いくつかの画面 + 設定画面」
のパターンを考えてみましょう。
ListViewを設定画面トップとして、各セルタップで子画面をPushAsync
と、やりたくなるのですが…。
Android, WindowsではTabが画面上部に表示されます。
Tabの子要素にNavigationPageを設定すると、NavigationBarがTabのさらに上に表示されてしまいます…。
NavigationBarを非表示にする方法
(参考)
XAMLなら、
C#なら、
NavigationBarを非表示にすると…
NavigationBarを非表示にするとなると、また別の悩みが出てきます。
Backキーを持たないiOS用にわざわざ戻るUIを実装しなければならない。
実装するにしても、Tabの表示位置の違いを意識して配置することになり、非常に悩みます。
個人的に現時点での落としどころとしては…。
その他もろもろ
表示画面変更の捕捉
OnCurrentPageChanged
をオーバーライドする
表示画面を切り替える
Current
を変更する
サンプル
TabbedPageについて、サンプル実装してみました。
いつもながら実験用の適当なコードですが…。