Fenêtre contextuelle
Les fenêtres contextuelles (« Popup ») sont un moyen très courant de présenter des informations à un utilisateur en rapport avec la tâche qu’il exécute. Si les systèmes d’exploitation offrent un moyen d’afficher un message et d’exiger une réponse de l’utilisateur, ces alertes sont généralement restrictives quant au contenu qu’un développeur peut fournir, à la disposition et à l’apparence.
Remarque
Si vous souhaitez présenter quelque chose de plus subtil à l’utilisateur, examinez nos options Toast et Snackbar.
La vue Popup
permet aux développeurs de créer leur propre interface utilisateur personnalisée et de la présenter à leurs utilisateurs.
Création d’une fenêtre contextuelle
Il est possible de créer un Popup
en XAML ou en C# :
XAML
Y compris l’espace de noms XAML
Pour utiliser le kit de ressources dans XAML, le xmlns
suivant doit être ajouté à votre page ou à votre affichage :
xmlns:toolkit="http://schemas.microsoft.com/dotnet/2022/maui/toolkit"
Il en résulte ce qui suit :
<ContentPage
x:Class="CommunityToolkit.Maui.Sample.Pages.MyPage"
xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml">
</ContentPage>
Serait modifié pour inclure le xmlns
de la manière suivante :
<ContentPage
x:Class="CommunityToolkit.Maui.Sample.Pages.MyPage"
xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:toolkit="http://schemas.microsoft.com/dotnet/2022/maui/toolkit">
</ContentPage>
Définition de votre fenêtre contextuelle
Notez que si un Popup
est créé en XAML, il doit également disposer d’un fichier code-behind C#. Pour savoir pourquoi cela est nécessaire, reportez-vous à cette page de documentation .NET MAUI.
Le moyen le plus simple de créer un Popup
est d’ajouter un .NET MAUI ContentView (XAML)
à votre projet et de modifier chacun des fichiers comme suit :
<toolkit:Popup xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:toolkit="http://schemas.microsoft.com/dotnet/2022/maui/toolkit"
x:Class="MyProject.SimplePopup">
<VerticalStackLayout>
<Label Text="This is a very important message!" />
</VerticalStackLayout>
</toolkit:Popup>
public partial class SimplePopup : Popup
{
public SimplePopup()
{
InitializeComponent();
}
}
Important
Si le fichier code-behind n’est pas créé en même temps que l’appel à InitializeComponent
, une exception est générée lorsque vous tentez d’afficher votre Popup
.
C#
using CommunityToolkit.Maui.Views;
var popup = new Popup
{
Content = new VerticalStackLayout
{
Children =
{
new Label
{
Text = "This is a very important message!"
}
}
}
};
Présentation d’une fenêtre contextuelle
Une fois que le Popup
a été créé, il peut ensuite être présenté à l’aide de nos méthodes d’extension Popup
ou via l’implémentation IPopupService
de ce kit de ressources.
Important
Un Popup
ne peut être affiché qu’à partir d’une Page
ou d’une implémentation qui hérite de Page
.
using CommunityToolkit.Maui.Views;
public class MyPage : ContentPage
{
public void DisplayPopup()
{
var popup = new SimplePopup();
this.ShowPopup(popup);
}
}
Fermeture d’une fenêtre contextuelle
Il existe deux façons différentes de fermer un Popup
: par programmation ou en appuyant à l’extérieur de la fenêtre contextuelle.
Fermeture d’une fenêtre contextuelle par programmation
Pour fermer un Popup
, un développeur doit appeler Close
ou CloseAsync
sur le Popup
lui-même. Cela se fait généralement en répondant à un appui sur un bouton effectué par un utilisateur.
Nous pouvons améliorer l’exemple XAML précédent en ajoutant un OKButton
:
<toolkit:Popup xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:toolkit="http://schemas.microsoft.com/dotnet/2022/maui/toolkit"
x:Class="MyProject.SimplePopup">
<VerticalStackLayout>
<Label Text="This is a very important message!" />
<Button Text="OK"
Clicked="OnOKButtonClicked" />
</VerticalStackLayout>
</toolkit:Popup>
Dans le gestionnaire d’événements obtenu, nous appelons Close
, ce qui a pour effet de fermer le Popup
par programmation.
Remarque
Close()
est une méthode de type « fire-and-forget » (déclencher et oublier). Une fois terminée, elle revient au thread appelant avant que le système d’exploitation supprime le Popup
de l’écran. Si vous avez besoin de suspendre l’exécution de votre code avant que le système d’exploitation supprime le Popup
de l’écran, utilisez plutôt CloseAsync()
.
public partial class MySimplePopup : Popup
{
// ...
void OnOKButtonClicked(object? sender, EventArgs e) => Close();
}
Dans le gestionnaire d’événements obtenu, nous appelons CloseAsync
, ce qui ferme par programmation le Popup
. L’appelant peut alors utiliser await
pour attendre la méthode, le temps que le système d’exploitation ait supprimé le Popup
de l’écran.
public partial class MySimplePopup : Popup
{
// ...
async void OnOKButtonClicked(object? sender, EventArgs e)
{
var cts = new CancellationTokenSource(TimeSpan.FromSeconds(5));
await CloseAsync(token: cts.Token);
await Toast.Make("Popup Dismissed By Button").Show();
}
}
Appui à l’extérieur de la fenêtre contextuelle
Par défaut, un utilisateur peut appuyer à l’extérieur du Popup
pour le supprimer. Cela peut être contrôlé via la propriété CanBeDismissedByTappingOutsideOfPopup
. En définissant cette propriété sur false
, vous empêcherez un utilisateur de supprimer le Popup
via un appui à l’extérieur de celui-ci.
Retour d’un résultat
Il arrivera assez souvent qu’un développeur cherche à obtenir une réponse de ses utilisateurs. La vue Popup
permet aux développeurs de retourner un résultat qui peut être attendu et traité.
Nous pouvons améliorer notre exemple XAML d’origine pour montrer comment faire cela :
XAML
En ajoutant 2 nouveaux boutons au code XAML :
<toolkit:Popup xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:toolkit="http://schemas.microsoft.com/dotnet/2022/maui/toolkit"
x:Class="MyProject.SimplePopup">
<VerticalStackLayout>
<Label Text="This is a very important message! Do you agree?" />
<Button Text="Yes"
Clicked="OnYesButtonClicked" />
<Button Text="No"
Clicked="OnNoButtonClicked" />
</VerticalStackLayout>
</toolkit:Popup>
Puis en ajoutant les gestionnaires d’événements suivants dans le code C# :
async void OnYesButtonClicked(object? sender, EventArgs e)
{
var cts = new CancellationTokenSource(TimeSpan.FromSeconds(5));
await CloseAsync(true, cts.Token);
}
async void OnNoButtonClicked(object? sender, EventArgs e)
{
var cts = new CancellationTokenSource(TimeSpan.FromSeconds(5));
await CloseAsync(false, cts.Token);
}
La méthode Close
permet de fournir une valeur object
; il s’agira de la valeur de retour résultante. Pour attendre le résultat, la méthode ShowPopupAsync
doit être utilisée comme suit :
using CommunityToolkit.Maui.Views;
public class MyPage : ContentPage
{
public async Task DisplayPopup()
{
var popup = new SimplePopup();
var result = await this.ShowPopupAsync(popup, CancellationToken.None);
if (result is bool boolResult)
{
if (boolResult)
{
// Yes was tapped
}
else
{
// No was tapped
}
}
}
}
Remarque
Pour gérer l’appui à l’extérieur d’un Popup
alors que vous attendez également le résultat, vous pouvez modifier la valeur retournée via la propriété ResultWhenUserTapsOutsideOfPopup
.
Style
La classe Popup
permet l’utilisation de Styles .NET MAUI pour faciliter le partage de paramètres visuels communs entre plusieurs fenêtres contextuelles.
L’exemple suivant montre comment définir un style qui s’applique à l’exemple SimplePopup
de la section précédente.
<toolkit:Popup xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:toolkit="http://schemas.microsoft.com/dotnet/2022/maui/toolkit"
xmlns:popups="clr-namespace:CommunityToolkit.Maui.Sample.Views.Popups"
x:Class="MyProject.SimplePopup">
<toolkit:Popup.Resources>
<Style TargetType="{x:Type popups:SimplePopup}">
<Setter Property="Size" Value="100,200" />
<Setter Property="Color" Value="Green" />
<Setter Property="HorizontalOptions" Value="Center" />
<Setter Property="VerticalOptions" Value="Start" />
<Setter Property="CanBeDismissedByTappingOutsideOfPopup" Value="True" />
</Style>
</toolkit:Popup.Resources>
<VerticalStackLayout>
<Label Text="This is a very important message! Do you agree?" />
<Button Text="Yes"
Clicked="OnYesButtonClicked" />
<Button Text="No"
Clicked="OnNoButtonClicked" />
</VerticalStackLayout>
</toolkit:Popup>
Remarque
Lorsque vous créez un Style
qui cible un Popup
et que vous souhaitez l’appliquer à des fenêtres contextuelles personnalisées comme l’exemple SimplePopup
, veillez à définir la propriété ApplyToDerivedTypes
dans la définition de Style
.
Propriétés
Propriété | Type | Description |
---|---|---|
Anchor |
View |
Obtient ou définit l’ancre View . L’ancre est l’emplacement au plus près duquel la fenêtre contextuelle s’affichera. Lorsqu’une ancre est configurée, la fenêtre contextuelle est centrée sur ce contrôle ou s’affiche le plus près possible de celui-ci. |
CanBeDismissedByTappingOutsideOfPopup |
bool |
Obtient ou définit une valeur indiquant si la fenêtre contextuelle peut être supprimée en appuyant à l’extérieur de celle-ci. Sur Android : lorsque la valeur est false, le bouton physique de retour arrière est désactivé. |
Color |
Color |
Obtient ou définit Color pour la fenêtre contextuelle. Cette propriété définit la couleur d’arrière-plan native du Popup , qui est indépendante de toute couleur d’arrière-plan configurée dans le Content effectif. |
Content |
View |
Obtient ou définit le contenu View à afficher dans le Popup . |
HorizontalOptions |
LayoutAlignment |
Obtient ou définit LayoutAlignment pour positionner le Popup horizontalement sur l’écran. |
Result |
Task<object?> |
Obtient le résultat final du Popup supprimé. |
Size |
Size |
Obtient ou définit Size pour l’affichage de la fenêtre contextuelle. La fenêtre contextuelle tente toujours de limiter la taille réelle du Popup à la taille de la vue, à moins que Size soit spécifié. Si le Popup utilise les propriétés HorizontalOptions ou VerticalOptions qui ne sont pas les valeurs par défaut, cette propriété Size est obligatoire. |
VerticalOptions |
LayoutAlignment |
Obtient ou définit LayoutAlignment pour positionner le Popup verticalement sur l’écran. |
Événements
Événement | Description |
---|---|
Closed |
Se produit lorsque le Popup est fermé. |
Opened |
Se produit lorsque le Popup est ouvert. |
Exemples
Vous trouverez un exemple d’utilisation de cette fonctionnalité dans l’exemple d’application du toolkit de la communauté .NET MAUI.
API
Vous pouvez trouver le code source dePopup
sur le référentiel du kit de ressources de la communauté .NET MAUI sur GitHub.
.NET MAUI Community Toolkit