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.
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();
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 } });
j'ai enfin trouvé une solution. Le code a essentiellement besoin de deux corrections mineures:
- envelopper tous
DetailPage
s dans unNavigationPage
, mais pas leMasterDetailPage
(voir #1, #2 et #3 ci-dessous). - Ajouter un
Icon
auMasterPage
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;
}
}