MasterDetailPageは、ページをMasterとDetailの2ページで構成するためのものです。
Masterには項目の一覧を、Detailには項目の詳細を表示します。
新規プロジェクトとしてBlank Xaml App(Xamarin.Forms.Portable)を作成してください。
プロジェクト名は、MasterDetaiPageSmapleとします。
MasterPageの作成
はじめにMasterPageを作成します。
ソリューションエクスプローラーには複数のプロジェクトがぶら下がっていますが、共通プロジェクトである「MasterDeitailPageSample(移植可能)」に、MasterPageという名前で新規にクラスを追加します。
MasterPage.csのファイルには以下のようなコードが記述されています。
using Xamarin.Forms; namespace MasterDetailPageSample { public class MasterPage : ContentPage { public MasterPage() { Content = new StackLayout { Children = { new Label { Text = "Hello Page" } } }; } } }
上記はContentPageを継承しているのですが、MasterDetailPageを継承するように変更し、コンストラクタ内を削除します(以下のように編集します)。
using Xamarin.Forms; namespace MasterDetailPageSample { public class MasterPage : MasterDetailPage { public MasterPage() { } } }
続いて、上記のコンストラクタ(MasterPage)を以下のように編集してマスターページを作成します。
public MasterPage() { // メニューに表示する文字列の作成 var menu = new[] { "メインメニュー", "メニュー1", "メニュー2", "メニュー3" }; // メニュー用のListView ListView listView = new ListView { // メニューを追加 ItemsSource = menu, // メニュー部分の背景色を白に設定 BackgroundColor = Color.White, }; // マスターページの作成 Master = new ContentPage { BackgroundColor = Color.White, Padding = new Thickness(0, 20, 0, 0), Title = "メニュー", // 必須 Content = listView }; // あとからコードを追加します }
マスターページに表示する項目は、文字配列として作成します。
上記の例では、menuという文字配列に、「メインメニュー」「メニュー1」「メニュー2」「メニュー3」の文字列を格納します。この文字列はListViewのItemSourceへ設定しています。
続いてマスターページを作成します。MasterDetailPageを継承したクラスはMasterというメンバーを持ちます。このMasterがマスタページを表しています。
MasterはContentPageとして作成し、MasterがもつContentには先ほど作成したlistViewを設定することで、menu配列に設定した文字列が表示されるようになります。
DetailPageの作成
続いてMasterPageに表示した項目に結びつけるDetailPageを作成します。
MasterDetailPageを使用するアプリケーションでは、画面に常に表示されるのは今から作成するDetailPageの方になります。
共通プロジェクトである「MasterDeitailPageSample(移植可能)」に、Page1という名前で新規に「Forms Xaml Page」追加します。このクラスはMasterPageのメニュー1に紐付けることとします。
同様にしてPage2とPage3のクラスを作成します。
最初に表示されるページの設定とメニュータップ時の処理
以上で必要なページは揃いました。
続いて画面に最初に表示されるページの設定とメニュー項目タップ時の処理を作成します。
MainPage.xaml.csを開き、「MasterPageの作成」の項に示したコードの最後にある「あとからコードを追加します」の部分に以下のコードを挿入します。
// 最初に表示されるページ Detail = new NavigationPage(new Page1()); ・・・① // メニュー項目タップ時の処理 listView.ItemTapped += (sender, e) => ・・・② { ContentPage newPage; // タップされたメニュー項目をswitchで判断 switch (e.Item.ToString()) { case "メニュー1": newPage = new Page1(); break; case "メニュー2": newPage = new Page2(); break; case "メニュー3": newPage = new Page3(); break; default: newPage = new Page1(); break; } // 選択ページを表示 Detail = new NavigationPage(newPage); ・・・③ // 選択ページのリセット ((ListView)sender).SelectedItem = null; ・・・④ // メニューを閉じる IsPresented = false; ・・・⑤ };
①はアプリ起動時に最初に表示されるページの設定です。ここではPage1が表示されるようにしています。
②はlistViewに表示されている項目がタップされたときの処理です。switch文を使用してタップされた項目の文字列を判断し、表示するページを決定しています。ここで決定したページをDetailにセットすることで、詳細ページとして表示します(③)。
④は選択されたページのリセットを行います。これはlistViewで選択された項目が残ってしまうことを避けるための処理です。
最後に⑤でメニューを閉じる処理を行います。この処理を省略した場合は、項目を選択してもメニューが表示されたままとなってしまいます。
起動時の設定
最後に起動時の設定を行います。
App.xaml.csを開き、コードを以下のように編集します。
①の部分で、画面起動にMasterPageが表示されるようにします。
public partial class App : Application { public App() { InitializeComponent(); MainPage = new MasterPage(); ・・・① } protected override void OnStart() { // Handle when your app starts } protected override void OnSleep() { // Handle when your app sleeps } protected override void OnResume() { // Handle when your app resumes } }
コードの編集が完了したら、実行して動作を確認してみましょう。
画面の上部には「メニュー」という文字が表示され、タップするとメニューが表示されます。
またメニューで項目を選択すると、対応するページが開きます。
コメント