Xamarin.Forms Pages modales
Xamarin.Forms prend en charge les pages modales. Une page modale encourage les utilisateurs à effectuer une tâche autonome et ne peut pas être quittée tant que la tâche n’est pas terminée ou annulée. Cet article explique comment accéder à des pages modales.
Cet article s’articule autour des rubriques suivantes :
- Navigation - Envoi (push) des pages vers la pile modale, dépilation des pages de la pile modale, désactivation du bouton Précédent et animation des transitions de page.
- Passage de données durant la navigation - Passage de données via un constructeur de page et via
BindingContext
.
Vue d’ensemble
Une page modale peut être n’importe quel type de page pris en charge par Xamarin.Forms. Pour afficher une page modale, l’application l’envoie vers la pile modale, où elle devient la page active, comme indiqué dans le diagramme suivant :
Pour retourner à la page précédente, l’application dépile la page actuelle de la pile modale. La nouvelle page la plus haute de la pile devient la page active, comme indiqué dans le diagramme suivant :
Navigation
Les méthodes de navigation modale sont exposées par la propriété Navigation
sur n’importe quel type dérivé Page
. Ces méthodes permettent d’envoyer (push) des pages modales vers la pile modale et de dépiler des pages modales de la pile modale.
La propriété Navigation
expose également une propriété ModalStack
à partir de laquelle les pages modales de la pile modale peuvent être obtenues. Toutefois, il n’existe aucun concept de manipulation de pile modale ni d’ajout à la page racine dans la navigation modale. En effet, ces opérations ne sont pas universellement prises en charge sur les plateformes sous-jacentes.
Remarque
Aucune instance de NavigationPage
n’est requise pour la navigation entre les pages modales.
Envoi de pages vers la pile modale
Pour accéder à ModalPage
, il est nécessaire d’appeler la méthode PushModalAsync
sur la propriété Navigation
de la page active, comme indiqué dans l’exemple de code suivant :
async void OnItemSelected (object sender, SelectedItemChangedEventArgs e)
{
if (listView.SelectedItem != null) {
var detailPage = new DetailPage ();
...
await Navigation.PushModalAsync (detailPage);
}
}
Ainsi, l’instance de ModalPage
est envoyée vers la pile modale, où elle devient la page active, à condition qu’un élément ait été sélectionné dans ListView
sur l’instance de MainPage
. L’instance de ModalPage
est présentée dans les captures d’écran suivantes :
Quand PushModalAsync
est appelé, les événements suivants se produisent :
- Pour la page qui appelle
PushModalAsync
, la substitution deOnDisappearing
est appelée, à condition que la plateforme sous-jacente ne soit pas de type Android. - La substitution
OnAppearing
de la page cible de la navigation est appelée. - La tâche
PushAsync
est effectuée.
Toutefois, l’ordre précis dans lequel ces événements se produisent dépend de la plateforme. Pour plus d’informations, consultez le chapitre 24 du livre de Xamarin.Forms Charles Petzold.
Remarque
Les appels des substitutions OnDisappearing
et OnAppearing
ne peuvent pas être considérés comme des indications garanties de la navigation entre les pages. Par exemple, sur iOS, la substitution de OnDisappearing
est appelée dans la page active quand l’application se termine.
Dépilation de pages de la pile modale
Vous pouvez dépiler la page active de la pile modale en appuyant sur le bouton Précédent de l’appareil, qu’il s’agisse d’un bouton physique sur l’appareil ou d’un bouton à l’écran.
Pour revenir par programmation à la page d’origine, l’instance de ModalPage
doit appeler la méthode PopModalAsync
, comme illustré dans l’exemple de code suivant :
async void OnDismissButtonClicked (object sender, EventArgs args)
{
await Navigation.PopModalAsync ();
}
Cela provoque la suppression de l’instance de ModalPage
de la pile modale. Ainsi, la nouvelle page située tout en haut de la pile devient la page active. Quand PopModalAsync
est appelé, les événements suivants se produisent :
- La substitution
OnDisappearing
de la page qui appellePopModalAsync
est appelée. - Pour la page retournée, la substitution de
OnAppearing
est appelée, à condition que la plateforme sous-jacente ne soit pas de type Android. - La tâche
PopModalAsync
est terminée.
Toutefois, l’ordre précis dans lequel ces événements se produisent dépend de la plateforme. Pour plus d’informations, consultez le chapitre 24 du livre de Xamarin.Forms Charles Petzold.
Désactivation du bouton Précédent
Sur Android, l’utilisateur peut toujours retourner à la page précédente en appuyant sur le bouton Précédent standard de l’appareil. Si la page modale impose à l’utilisateur d’exécuter une tâche autonome avant de quitter la page, l’application doit désactiver le bouton Précédent. Pour ce faire, substituez la méthode Page.OnBackButtonPressed
dans la page modale. Pour plus d’informations, consultez le chapitre 24 du livre de Xamarin.Forms Charles Petzold.
Animation des transitions de page
La propriété Navigation
de chaque page fournit également des méthodes d’envoi et de dépilation substituées qui incluent un paramètre boolean
contrôlant l’affichage d’une animation de page durant la navigation, comme indiqué dans l’exemple de code suivant :
async void OnNextPageButtonClicked (object sender, EventArgs e)
{
// Page appearance not animated
await Navigation.PushModalAsync (new DetailPage (), false);
}
async void OnDismissButtonClicked (object sender, EventArgs args)
{
// Page appearance not animated
await Navigation.PopModalAsync (false);
}
Si vous affectez au paramètre boolean
la valeur false
, l’animation de transition de page est désactivée. En revanche, si vous affectez au paramètre la valeur true
l’animation de transition de page est activée, à condition qu’elle soit prise en charge par la plateforme sous-jacente. Toutefois, les méthodes d’envoi et de dépilation qui n’ont pas ce paramètre activent l’animation par défaut.
Passage des données durant la navigation
Il est parfois nécessaire qu’une page passe des données à une autre page durant la navigation. Il existe deux techniques pour y parvenir : passer les données via un constructeur de page et définir le BindingContext
de la nouvelle page en fonction des données. Nous allons maintenant examiner chacune de ces techniques.
Passage des données via un constructeur de page
La technique la plus simple pour passer des données à une autre page durant la navigation consiste à utiliser un paramètre de constructeur de page, comme indiqué dans l’exemple de code suivant :
public App ()
{
MainPage = new MainPage (DateTime.Now.ToString ("u")));
}
Ce code crée une instance de MainPage
en passant la date et l’heure actuelles au format ISO8601.
L’instance de MainPage
reçoit les données par le biais d’un paramètre de constructeur, comme illustré dans l’exemple de code suivant :
public MainPage (string date)
{
InitializeComponent ();
dateLabel.Text = date;
}
Les données sont ensuite affichées dans la page via la définition de la propriété Label.Text
.
Transmission de données par le biais d’un BindingContext
Il existe une autre approche pour passer des données à une autre page durant la navigation. Elle consiste à affecter les données au BindingContext
de la nouvelle page, comme indiqué dans l’exemple de code suivant :
async void OnItemSelected (object sender, SelectedItemChangedEventArgs e)
{
if (listView.SelectedItem != null) {
var detailPage = new DetailPage ();
detailPage.BindingContext = e.SelectedItem as Contact;
listView.SelectedItem = null;
await Navigation.PushModalAsync (detailPage);
}
}
Ce code affecte au BindingContext
de l’instanceDetailPage
l’instance de Contact
, puis accède à DetailPage
.
DetailPage
utilise ensuite la liaison de données pour afficher les données de l’instance de Contact
, comme indiqué dans l’exemple de code XAML suivant :
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="ModalNavigation.DetailPage">
<ContentPage.Padding>
<OnPlatform x:TypeArguments="Thickness">
<On Platform="iOS" Value="0,40,0,0" />
</OnPlatform>
</ContentPage.Padding>
<ContentPage.Content>
<StackLayout HorizontalOptions="Center" VerticalOptions="Center">
<StackLayout Orientation="Horizontal">
<Label Text="Name:" FontSize="Medium" HorizontalOptions="FillAndExpand" />
<Label Text="{Binding Name}" FontSize="Medium" FontAttributes="Bold" />
</StackLayout>
...
<Button x:Name="dismissButton" Text="Dismiss" Clicked="OnDismissButtonClicked" />
</StackLayout>
</ContentPage.Content>
</ContentPage>
L’exemple de code suivant montre comment la liaison de données peut être effectuée en C# :
public class DetailPageCS : ContentPage
{
public DetailPageCS ()
{
var nameLabel = new Label {
FontSize = Device.GetNamedSize (NamedSize.Medium, typeof(Label)),
FontAttributes = FontAttributes.Bold
};
nameLabel.SetBinding (Label.TextProperty, "Name");
...
var dismissButton = new Button { Text = "Dismiss" };
dismissButton.Clicked += OnDismissButtonClicked;
Thickness padding;
switch (Device.RuntimePlatform)
{
case Device.iOS:
padding = new Thickness(0, 40, 0, 0);
break;
default:
padding = new Thickness();
break;
}
Padding = padding;
Content = new StackLayout {
HorizontalOptions = LayoutOptions.Center,
VerticalOptions = LayoutOptions.Center,
Children = {
new StackLayout {
Orientation = StackOrientation.Horizontal,
Children = {
new Label{ Text = "Name:", FontSize = Device.GetNamedSize (NamedSize.Medium, typeof(Label)), HorizontalOptions = LayoutOptions.FillAndExpand },
nameLabel
}
},
...
dismissButton
}
};
}
async void OnDismissButtonClicked (object sender, EventArgs args)
{
await Navigation.PopModalAsync ();
}
}
Les données sont ensuite affichées dans la page par une série de contrôles Label
.
Pour plus d’informations sur la liaison de données, consultez Notions de base de la liaison de données.
Résumé
Cet article a montré comment accéder aux pages modales. Une page modale encourage les utilisateurs à effectuer une tâche autonome et ne peut pas être quittée tant que la tâche n’est pas terminée ou annulée.