Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
O PopupService
fornece um mecanismo para exibir Popups dentro de um aplicativo usando o padrão MVVM.
As seções a seguir serão incrementalmente baseadas em como usar o PopupService
em um aplicativo .NET MAUI.
Criando um pop-up
Para usar o PopupService
para apresentar ou fechar um Popup
o Popup
deve primeiro ser registrado. Com base nas etapas em Exibindo um pop-up , o seguinte pode ser criado.
O conteúdo XAML do Popup
pode ser definido como:
<ContentView
xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:viewModels="clr-namespace:MyProject.ViewModels"
x:Class="MyProject.Popups.NamePopup"
HorizontalOptions="Center"
VerticalOptions="Center"
Padding="10"
Spacing="6"
x:DataType="viewModels:NamePopupViewModel">
<VerticalStackLayout>
<Label Text="What is your name?" />
<Entry Text="{Binding Name}" />
<Button Text="Save" Command="{Binding SaveCommand}" />
<Button Text="Cancel" Command="{Binding CancelCommand}" />
</VerticalStackLayout>
</ContentView>
O conteúdo C# do Popup
pode ser definido como:
using MyProject.ViewModels;
namespace MyProject.Popups;
public partial class NamePopup : ContentView
{
public NamePopup(NamePopupViewModel namePopupViewModel)
{
InitializeComponent();
BindingContext = namePopupViewModel;
}
}
O modelo de visualização de suporte para o Popup
pode ser definido como:
public class NamePopupViewModel : ObservableObject
{
[ObservableProperty]
public partial string Name { get; set; } = string.Empty;
readonly IPopupService popupService;
public NamePopupViewModel(IPopupService popupService)
{
this.popupService = popupService;
}
void OnCancel()
{
}
[RelayCommand(CanExecute = nameof(CanSave))]
void OnSave()
{
}
bool CanSave() => string.IsNullOrWhitespace(Name) is false;
}
Registrar um popup
A fim de primeiro usar o IPopupService
para exibir um pop-up na sua aplicação, você precisará registar o modelo e a vista do pop-up com o MauiAppBuilder
, o que pode ser feito através de Registar Vista e Modelo do Pop-up.
Com base no exemplo acima, o código a seguir pode ser adicionado ao arquivo MauiProgram.cs.
builder.Services.AddTransientPopup<NamePopup, NamePopupViewModel>();
Exibir uma janela de aviso
O .NET MAUI Community Toolkit fornece um mecanismo para instanciar e apresentar pop-ups em um aplicativo .NET MAUI. O serviço pop-up é automaticamente registado com o MauiAppBuilder
ao usar o UseMauiCommunityToolkit
método de inicialização. Isso permite que você resolva uma IPopupService
implementação em qualquer parte do seu aplicativo.
O IPopupService
torna possível registrar uma visualização pop-up e seu modelo de exibição associado. A capacidade de mostrar Popup
exige que o desenvolvedor forneça a implementação atual INavigation
para a janela atual no aplicativo. A maneira mais fácil de conseguir isso é através do exemplo a seguir.
O exemplo a seguir mostra como usar o IPopupService
para criar e exibir um pop-up em um aplicativo .NET MAUI:
public class MyViewModel : INotifyPropertyChanged
{
private readonly IPopupService popupService;
public MyViewModel(IPopupService popupService)
{
this.popupService = popupService;
}
public void DisplayPopup()
{
this.popupService.ShowPopup<NamePopupViewModel>(Shell.Current);
}
}
Como alternativa, o chamador pode aguardar o método ShowPopupAsync para lidar com um resultado que está sendo retornado. O DisplayPopup
método pode ser reescrito como:
public async Task DisplayPopup()
{
var result = await this.popupService.ShowPopupAsync<NamePopupViewModel>(currentPage.Navigation);
}
Para um exemplo mais concreto, consulte a nossa aplicação de exemplo e o exemplo em MultiplePopupViewModel
O IPopupService
também fornece métodos para lidar com um resultado que está sendo retornado de um pop-up, conforme abordado em Retornando um resultado.
Passando dados para um modelo de exibição pop-up
Ao apresentar um pop-up, às vezes precisamos passar dados para o modelo de exibição subjacente para permitir que o conteúdo dinâmico seja apresentado ao usuário.
IPopupService
torna isso possível através das sobrecargas dos métodos ShowPopup
e ShowPopupAsync
que tomam um parâmetro IDictionary<string, object> shellParameters
. Isso faz uso da interface fornecida com o IQueryAttributable
.NET MAUI Shell, para obter mais informações sobre como usá-lo, consulte Processar dados de navegação usando um único método.
Para estender o exemplo anterior de mostrar um NamePopupViewModel
e seu Popup associado, podemos estender o NamePopupViewModel
para implementar a IQueryAttributable
interface da seguinte maneira:
public class NamePopupViewModel : ObservableObject, IQueryAttributable
{
[ObservableProperty]
public partial string Name { get; set; } = "";
public void ApplyQueryAttributes(IDictionary<string, object> query)
{
Name = (string)query[nameof(NamePopupViewModel.Name)];
}
}
Em seguida, o modelo de exibição que apresenta o pop-up e passa os dados pode ter a seguinte aparência:
public class MyViewModel : INotifyPropertyChanged
{
private readonly IPopupService popupService;
public MyViewModel(IPopupService popupService)
{
this.popupService = popupService;
}
public async Task DisplayPopup()
{
var queryAttributes = new Dictionary<string, object>
{
[nameof(NamePopupViewModel.Name)] = "Shaun"
};
await this.popupService.ShowPopupAsync<NamePopupViewModel>(
Shell.Current,
options: PopupOptions.Empty,
shellParameters: queryAttributes);
}
}
Fechar uma janela pop-up
O PopupService
fornece o método ClosePopupAsync
que torna possível fechar um Popup
a partir de um modelo de visualização.
Fechar programaticamente um pop-up
Expandindo o exemplo anterior, a seguinte implementação pode ser adicionada ao OnCancel
método:
[RelayCommand]
async Task OnCancel()
{
await popupService.ClosePopupAsync(Shell.Current);
}
Isso fará com que o Popup
exibido mais recentemente seja fechado.
Devolver um resultado
Ao fechar um Popup
é possível devolver um resultado ao chamador que apresentou o Popup
.
Expandindo o exemplo anterior, a seguinte implementação pode ser adicionada ao OnSave
método:
[RelayCommand(CanExecute = nameof(CanSave))]
async Task OnSave()
{
await popupService.ClosePopupAsync(Shell.Current, Name);
}
Isso resultará no fechamento da Popup
mais recentemente exibida e no retorno ao chamador do valor em Name
encapsulado dentro de uma implementação de IPopupResult<T>
. Para obter mais informações sobre como criar um Popup
que pode retornar um resultado, consulte Popup
- Retornando um resultado.
Exemplos
Você pode encontrar um exemplo desse recurso em ação no .NET MAUI Community Toolkit Sample Application.
API
Você pode encontrar o código-fonte para Popup
no repositório GitHub do .NET MAUI Community Toolkit.
Recursos adicionais
.NET MAUI Community Toolkit