2015-01-08 28 views
9

masterdetailページを使用してすべてのページにメニューを表示するアプリがあります。ナビゲーションは私のアプリで2つの方法で行われます。 1つはメニューから、もう1つはダッシュボードから。そのため、別のページに移動して「戻る」ボタンを押すと、アプリケーションが終了します。ナビゲーション履歴は覚えていません。 マスター詳細ページ以下の通りである:そうXamarin.Forms - マスター/詳細ページとナビゲーション履歴の問題

public class RootPage : MasterDetailPage 
    { 
     public RootPage() 
     { 
      var menuPage = new MenuPage(); 

      menuPage.Menu.ItemSelected += (sender, e) => NavigateTo (e.SelectedItem as MenuItem); 

      Master = menuPage; 
      Detail = new NavigationPage (new ContractsPage()); 
     } 

     void NavigateTo (MenuItem menu) 
     { 
      Page displayPage = (Page)Activator.CreateInstance (menu.TargetType); 
      Detail = new NavigationPage (displayPage); 
      IsPresented = false; 
     } 
    } 

この問題を克服するためにどのように任意のアイデア?

答えて

17

何ステン・ペトロフが言った@:あなたは詳細ページを置き換えると履歴メカニズムをトリガされていません。履歴メカニズムを起動するには、詳細ページのナビゲーションプロパティでPushAsync(Page)を実行する必要があります。あなたの例では

、NavigateToを変更:

void NavigateTo (MenuItem menu) 
{ 
    Page displayPage = (Page)Activator.CreateInstance (menu.TargetType); 
    Detail.Navigation.PushAsync(displayPage); 
} 

これは、コンテンツを置き換えることはありませんが、あなたが望むバックボタンの機能と新しいページが表示されます。

マスター - 詳細ページで戻るボタン機能を使用する場合は、私の意見では価値がないバックスタックプロセスをカスタマイズする必要があります。その場合、別のページ/ナビゲーション構造に移動するだけです。

+0

これは私の問題を解決するために必要なものです - ありがとう! –

4

ここで問題となるのは、ナビゲーションスタックを使用してページの遷移を実行するのではなく、自分のページのアイテムを置き換えるためです。ナビゲーション履歴がないため、移動したページMasterDetailPage。

この問題を解決するには、MasterDetailPageを継承してメニューを初期化した新しいMenuMasterDetail.csクラスを作成し、共通基盤と共通基底クラスを継承するMenuItem_A_Page.xaml(または.cs)を作成しますNavigation.PushAsync(...)を使用してページ間を移動してください。

基底クラス:CSで

public class MenuDetailPage: MasterDetailPage{ 
    public MenuDetailPage(): base(){ 
    this.Master = BuildMyMenuListHere(); // the menu items will also define navigation targets 
    } 
} 

サブクラス:XAMLで

public class FirstDetailWithMenuPage: MenuDetailPage{ 
    public FirstDetailWithMenuPage() 
    : base() // this creates the menu 
    { 
    this.Detail = new StackLayout{ // change this however you need 
     Children = { 
     new Label { Text = "This is the first page" }, 
     new Button { Text= "Ok"}, 
    } 
    } 
} 

サブクラス(上からCSとともに、マイナスの詳細が設定されている部分):

<local:FirstDetailWithMenuPage namespace:YourNamespace;assembly=YourAssemblyName" xmlns="http://xamarin.com/schemas/2014/forms" xmlns:local="clr-n xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" x:Class="FirstDetailWithMenuPage"> 
    <local:FirstDetailWithMenuPage.Detail> 
... 

また、App.csを更新して、所有している最初のマスター/詳細ページのナビゲーションページを表示します(ベースページではありません) :

App.cs:

よう
public static Page GetMainPage() 
{ 
    return new NavigationPage(new FirstDetailWithMenuPage()); 
} 
+0

@Sten Petrovに感謝します。 push ayncを使用してナビゲーションスタックを使用した場合、問題はメニューがなくなったことです。私はすべてのページにメニューを保持したい。私は詳細ページで各ページを読み込みます。言及したアプローチでサンプルなどを提供できますか? – SoftSan

+0

だから私の提案は、基本クラスのメニューを定義し、それから継承して、MasterDetailPageのメニューを取得できるように詳細を変更することでしたが、ナビゲーションスタックを使用することができます –

+0

サンプルに@Sten Petrovありがとうございました。実装しようとしましたが、PushAsyncがAndroidでグローバルにサポートされていないなどのエラーが発生します。 Navigation.PushAsync()を使用してページをプッシュしようとしています。また、私はマスターのみを使用することはできませんので、詳細ページを最初に設定する必要があります。詳細ページはMenudetailpage()に追加する必要があります。それ以外の場合は、エラーが発生します。 – SoftSan

関連する問題