Affiche le bouton "Retour au Menu" dans la barre de navigation iOS avec Xamarin.Forme

j'essaie de construire une application multiplateformes en utilisant C# et Xamarin.Forme. Il contient un menu de sortie mis en œuvre sous la forme d'un MasterDetailPage . Alors que sur Android il ya un bouton avec l'icône de l'application dans le coin supérieur gauche, qui bascule la page de sortie de diapositives, il n'y a aucun élément de barre de navigation de ce type sur iOS.

Je l'ai décomposé à l'exemple minimum suivant dérivé du modèle Xamarin solution "Blank App (Xamarin.Les formulaires partagés) " et en remplaçant la mise en œuvre de la classe App :

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

la solution ainsi que les captures d'écran résultantes peuvent être trouvées à GitHub .

mon idée était d'ajouter un tel" menu "ou" Retour "bouton dans le code iOS spécifique modifiant le window.RootViewController.NavigationController.NavigationBar dans la classe AppDelegate . Mais window.RootViewController.NavigationController est null .

remplacer le type de retour GetMainPage() par NavigationPage au lieu de Page n'aide pas.

je pourrais ajouter des articles de barre d'outils via MDPage.ToolbarItems.Add(...) , mais ils apparaissent en haut à droite coin.

8
demandé sur Falko 2014-07-11 18:28:33

3 réponses

TL; DR

essentiellement, votre page Detail doit être enveloppée dans un NavigationPage pour que le bouton de retour apparaisse dans iOS.


voici un exemple de la façon dont je structure mes applications.

App.cs

    public static INavigation Navigation { get; set; }

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

de la page d'accueil.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;
    }
}

maintenant que vous avez fait ceci, votre tiroir de Navigation se comportera comme prévu, ainsi que votre barre d'action.

lorsque vous voulez naviguer dans l'application, vous utilisez la définition statique Navigation

await App.Navigation.PushAsync(new FooPage());
// or
await App.Navigation.PopAsync();
5
répondu Chase Florell 2014-07-15 20:05:27

votre sur la bonne voie, votre page de navigation doit aller sur le détail ainsi

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

and

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

serait

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

and

MDPage.Detail = new NavigationPage(new ContentPage { Content = new Label { Text = name } });
1
répondu lee 2014-07-12 20:37:25

j'ai enfin trouvé une solution. Le code a essentiellement besoin de deux corrections mineures:

  1. envelopper tous DetailPage s dans un NavigationPage , mais pas le MasterDetailPage (voir #1, #2 et #3 ci-dessous).
  2. Ajouter un Icon au MasterPage sur iOS (voir #4 ci-dessous). N'oubliez pas de un la réelle PNG(!) aux ressources de l'iOS.

l'exemple de travail minimal est le suivant:

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;
    }
}
1
répondu Falko 2016-01-19 14:08:56