2014-07-11 12 views
8

Ich versuche, eine plattformübergreifende Anwendung mit C# und Xamarin.Forms zu erstellen. Es enthält ein Ausklappmenü, das in Form eines MasterDetailPage implementiert ist. Während auf Android eine Schaltfläche mit dem App-Symbol in der oberen linken Ecke vorhanden ist, die die Ausklappseite umschaltet, gibt es unter iOS kein Navigationselement.Schaltfläche "Zurück zum Menü" in der iOS-Navigationsleiste mit Xamarin.Forms anzeigen

I brach es auf das folgende Mindest Beispiel unten abgeleitet von der Xamarin Lösungsvorlage „Blank App (Xamarin.Forms Geteilt)“ und Ersetzen der Umsetzung des App -Klasse:

public class App 
{ 
    static MasterDetailPage MDPage; 

    public static Page GetMainPage() 
    { 
     return new NavigationPage(
      MDPage = new MasterDetailPage { 
       Master = new ContentPage { 
        Title = "Master", 
        Content = new StackLayout { 
         Children = { Link("A"), Link("B"), Link("C") } 
        }, 
       }, 
       Detail = new ContentPage { Content = new Label { Text = "A" } }, 
      }); 
    } 

    static Button Link(string name) 
    { 
     var button = new Button { Text = name }; 
     button.Clicked += delegate { 
      MDPage.Detail = new ContentPage { Content = new Label { Text = name } }; 
      MDPage.IsPresented = false; 
     }; 
     return button; 
    } 
} 

Die Lösung sowie Als Ergebnis Screenshots finden Sie unter .

Meine Idee war, eine solche "Menü" oder "Zurück" -Schaltfläche in den iOS-spezifischen Code hinzuzufügen, der die window.RootViewController.NavigationController.NavigationBar innerhalb der AppDelegate Klasse modifiziert. Aber window.RootViewController.NavigationController ist null.

Das Ersetzen des Rückgabetyps von GetMainPage() durch NavigationPage anstelle von Page hilft nicht.

Ich könnte Toolbar Elemente über MDPage.ToolbarItems.Add(...) hinzufügen, aber sie erscheinen in der oberen rechts Ecke.

Antwort

1

Ich fand schließlich eine Lösung statisch Navigation definiert. Der Code muss im Grunde zwei kleinere Korrekturen:

  1. Wrap all DetailPage s in einem NavigationPage, aber nicht die MasterDetailPage (siehe # 1, # 2 und # 3 unten).
  2. Fügen Sie eine Icon zu der MasterPage bei iOS (siehe # 4 unten) hinzu. Vergiss nicht das tatsächliche PNG (!) Zu den iOS Ressourcen.

Die minimale Arbeitsbeispiel ist wie folgt: Das klingt sehr viel versprechend

public static class App 
{ 
    static MasterDetailPage MDPage; 

    public static Page GetMainPage() 
    { 
     return MDPage = new MasterDetailPage { // #1 
      Master = new ContentPage { 
       Title = "Master", 
       Icon = Device.OS == TargetPlatform.iOS ? "menu.png" : null, // #4 
       Content = new StackLayout { 
        Children = { Link("A"), Link("B"), Link("C") } 
       }, 
      }, 
      Detail = new NavigationPage(new ContentPage { Content = new Label { Text = "A" } }), // #2 
     }; 
    } 

    static Button Link(string name) 
    { 
     var button = new Button { Text = name }; 
     button.Clicked += delegate { 
      MDPage.Detail = new NavigationPage(new ContentPage { Content = new Label { Text = name } }); // #3 
      MDPage.IsPresented = false; 
     }; 
     return button; 
    } 
} 
+0

Ursprünglich habe ich diese Lösung als Update für meine Frage veröffentlicht. Gerade jetzt habe ich beschlossen, es in eine explizite Antwort zu verschieben. – Falko

+0

Ist diese App-Klasse nicht dieselbe wie die App-Klasse, die die Application-Klasse erweitert? – Krrish

+0

@Krrish: Als ich diese Lösung fand (kurz nachdem ich die Frage gepostet hatte), war dies der Weg, um die Anwendungsklasse zu erweitern. Aufgrund eines Xamarin.Forms-Updates hat sich das ziemlich verändert. Unter [hier] (http://xforms-kickstarter.com/#a-slide-out-menu- using-a-master-detail-page) finden Sie ein aktuelles Beispiel für Master-Detail-Seiten. – Falko

1

Ihr auf dem richtigen Weg, muss Ihr NavigatePage auf das Detail gehen, so

Detail = new ContentPage { Content = new Label { Text = "A" } } 

and 

MDPage.Detail = new ContentPage { Content = new Label { Text = name } }; 

würde

Detail = new NavigationPage(new ContentPage { Content = new Label { Text = "A" } }) 

and 

MDPage.Detail = new NavigationPage(new ContentPage { Content = new Label { Text = name } }); 
+0

. (Da Android nicht erlaubt mehrere Navigationsseiten auf dem Bildschirm zu einer Zeit, ich ersetzt '' 'zurück neue NavigationPage (MDPage = ...)' '' mit '' 'Rückkehr MDPage'' auch.) Aber jetzt ich ein Symbol auf Android und der Titel der '' 'Master''-Seite auf iOS. Und '' 'window.RootViewController.NavigationController''' ist immer noch Null, daher sehe ich nicht, wie man das Erscheinungsbild der Symbolleiste bzw. der Zurück-Schaltfläche weiter steuert. – Falko

5

TL sein; DR

Im Wesentlichen Ihre Detail Seite Bedürfnisse in eine NavigationPage verpackt werden, damit die Schaltfläche "Zurück" in iOS angezeigt wird.


Hier ist ein Beispiel, wie ich meine Apps strukturiere.

App.cs

public static INavigation Navigation { get; set; } 

    public static Page GetMainPage(IContainer container) 
    { 
     return new MainPage(); 
    } 

MainPage.cs

public class MainPage : MasterDetailPage 
{ 

    public MainPage() 
    { 
     Title = "Some Title"; 
     var master = new MainMenu(); 
     var detail = new NavigationPage(new FirstPage()); 

     if (App.Navigation == null) 
     { 
      App.Navigation = detail.Navigation; 
     } 

     Master = master; 
     Detail = detail; 
    } 
} 

Nun, da Sie dies getan haben, Ihre Navigationsleiste wird wie erwartet verhalten und so wird Ihre ActionBar.

Wenn Sie überall in der App navigieren möchten, verwenden Sie die

await App.Navigation.PushAsync(new FooPage()); 
// or 
await App.Navigation.PopAsync(); 
+0

Ok, macht '' 'PushAsync'' auf' '' button.Clicked() '' 'öffnet eine neue Detailseite mit einer" Zurück "Taste, die jedoch - zurück - auf die vorherige Detailseite verweist, nicht auf die Menü (aka Master oder MainMenu) wie vorgesehen. Außerdem ist das '' 'Fenster.RootViewController.NavigationController''' immer noch' '' null''', daher kann ich die Schaltfläche nicht auf diese Weise ändern. – Falko

+0

Was ich versuche zu erreichen, ist ein ähnliches Verhalten wie in [diesem Video] (https://www.youtube.com/watch?v=yVbcBdxIDwQ). – Falko

+0

Was ist in diesem Video ist das Standardverhalten, wenn Sie das tun, was ich oben getan habe. Ihre 'FirstPage' wäre die Seite mit dem Bild darauf. Beachten Sie, dass Sie das Symbol auch auf der Seite MainMenu (Master) einstellen müssen. –