Xamarin.Forms MasterBehaviorについて
MasterBehavior
MasterBehaviorとは、Xamarin.Forms 1.3で、MasterDetailPageに新しく追加されたプロパティです。
このプロパティは、列挙型になっており、Masterページ(通常メニュー的に左側に表示されるビュー)の隠れ具合を制御しています。
- Split 常時表示
- Popover 隠れる
- SplitOnPortrait 縦の時、常時表示
- SplitOnLandscape 横の時、常時表示
- Default(SplitOnLandscapeと同じ)





なお、このオプションは、iPadなど大きなディスプレイの端末の時だけ機能し、iPhoneの場合は、常に隠れる動作(MasterBehavior.Popoverと同等)となります。
また、Ver1.3では、ちょっとバグがあるような記載があったのVer1.4で動作確認しました。
PM> Get-Package Id Version Description/Release Notes -- ------- ------------------------- WPtoolkit 4.2013.08.16 Windows Phone toolkit provides ... Xamarin.Android.Support.v4 19.0.2 C# bindings for android support library v4. Xamarin.Forms 1.4.2.6355 Build native UIs for iOS, Android, and Windows Phone ..
動作
Popover
メニューが隠れる動作は、つぎのような感じです。
Slpit
メニューが常時表示する動作は、つぎのような感じです。
コード
使用したコードを参考までにusing System; using System.Linq; using Xamarin.Forms; namespace App1{ public class App : Application{ public App(){ MainPage = new MyPage(); } protected override void OnStart(){} protected override void OnSleep(){} protected override void OnResume(){} } class MyPage : MasterDetailPage{ public MyPage() { MasterBehavior = MasterBehavior.Split; var ar = Enumerable.Range(0, 20).Select(n => "Items-" + n).ToList(); var listView = new ListView { ItemsSource = ar, BackgroundColor = Color.Transparent, }; listView.ItemSelected += (s, a) => SetDetailPage(a.SelectedItem.ToString()); Master = new ContentPage{ BackgroundColor = Color.Teal, Title = "TEST",//Maserページでは、Titleが設定されていないと動作できない Padding = new Thickness(0, Device.OnPlatform(20, 0, 0), 0, 0), Content = listView, }; SetDetailPage(ar[0]); } void SetDetailPage(string title) { Detail = new NavigationPage(new DetailPage(title)){ BarBackgroundColor = Color.Silver,//上部の背景色 }; try{ //MasterBehavior.Split等でIsPresentedをfalseにしようとすると例外となる IsPresented = false; }catch (Exception ex) { DisplayAlert("Exception",ex.Message, "OK"); } } } class DetailPage : ContentPage{ public DetailPage(string title){ Content = new Label{ Text = title, HorizontalOptions = LayoutOptions.Center, VerticalOptions = LayoutOptions.Center }; } } }