2015-01-08 17 views
9

Mam aplikację, która używa strony masterdetail do wyświetlania menu na wszystkich stronach. Nawigacja odbywa się w mojej aplikacji na dwa sposoby. jeden z menu i drugi sposób z pulpitu nawigacyjnego. więc jeśli przejdę do innej strony, a następnie naciśnie przycisk "WSTECZ", to zamknie aplikację. Nie pamięta historii nawigacji. Strona wzorcowa szczegół jest jak poniżej:Xamarin.Forms - wydanie strony głównej i szczegółowej historii nawigacji

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; 
     } 
    } 

więc wszelkie pomysły jak rozwiązać ten problem?

Odpowiedz

17

Jak co @ Sten-Pietrow powiedział: wymieniasz stronę szczegółów i nie uruchamiając mechanizm historii. Aby uruchomić mechanizm historii, należy wykonać PushAsync (stronę) we właściwości nawigacji na stronie szczegółów.

W przykładzie zmienić NavigateTo:

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

To nie zastąpi treści, ale spowoduje nową stronę z funkcjonalnością przycisk BACK chcesz.

Jeśli chcesz korzystać z funkcji przycisku wstecz na stronie szczegółów głównych, musisz dostosować proces tworzenia kopii zapasowych, który, moim zdaniem, nie jest tego wart. Po prostu przejdź do innej strony/struktury nawigacji w tym przypadku.

+0

To jest dokładnie to, czego potrzebowałem, aby rozwiązać mój problem - dzięki! –

4

Problem polega na tym, że nie używasz stosu Nawigacji do wykonywania przejść na twoich stronach, ale zamiast tego zamieniasz element na swojej własnej stronie, więc nie ma historii nawigacji, która mogłaby przejść "wstecz" poza stronę, do której prowadzi nawigacja. MasterDetailPage.

Można rozwiązać ten problem poprzez utworzenie nowej klasy, która dziedziczy MasterDetailPage MenuMasterDetail.cs i Inicjuje menu, a następnie utworzyć MenuItem_A_Page.xaml (lub .CS), które dziedziczą z wspólnej podstawy w swojej wspólnej klasy bazowej będziesz użyj przejścia Navigation.PushAsync(...) do przejścia między stronami.

klasy skład:

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

podklasa w CS:

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"}, 
    } 
    } 
} 

podklasa w XAML (wraz z CS z góry, bez części, gdzie detal jest)

<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> 
... 

Zaktualizuj również plik App.cs, aby zwrócić stronę nawigacyjną z pierwszą stroną główną/szczegółową (nie podstawową) :

App.cs:

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

dzięki @Sten Petrov. Jeśli użyłem stosu nawigacyjnego za pomocą funkcji push aync, problem polega na tym, że menu zniknęło. podczas gdy chcę zachować menu na wszystkich stronach. więc ładuję każdą stronę ze szczegółami. Czy możesz podać próbkę lub coś podobnego do wspomnianego podejścia? – SoftSan

+0

Dlatego moją sugestią było zdefiniowanie menu w klasie bazowej, a następnie dziedziczenie po nim, aby zmienić szczegóły, aby uzyskać menu strony głównej, ale nadal możesz używać stosu nawigacji –

+0

Dzięki @Sten Petrov dla twojej próbki. Próbowałem zaimplementować, ale pojawia się błąd, taki jak PushAsync nie jest obsługiwany globalnie w systemie Android. Próbuję przesłać stronę za pomocą funkcji Navigation.PushAsync(). Również muszę najpierw ustawić stronę szczegółową, ponieważ nie pozwoli mi ona używać tylko wzorca. Strona szczegółów musi zostać dodana w Menudetailpage(). W przeciwnym razie spowoduje błąd. – SoftSan

Powiązane problemy