Janelas .NET MAUI
A classe de Window do .NET MAUI (.NET Multi-Platform App UI) fornece a capacidade de criar, configurar, mostrar e gerenciar várias janelas.
Window define as propriedades a seguir:
- FlowDirection, do tipo
FlowDirection
, define a direção na qual o elemento da interface do usuário da janela é disposto. - Height, do tipo
double
, especifica a altura da janela no Windows. - MaximumHeight, do tipo
double
, representa a altura máxima da janela em plataformas de área de trabalho. Os valores válidos são de 0 adouble.PositiveInfinity
. - MaximumWidth, do tipo
double
, representa a largura máxima da janela em plataformas de área de trabalho. Os valores válidos são de 0 adouble.PositiveInfinity
. - MinimumHeight, do tipo
double
, representa a altura mínima da janela em plataformas de área de trabalho. Os valores válidos são de 0 adouble.PositiveInfinity
. - MinimumWidth, do tipo
double
, representa a largura mínima da janela em plataformas de área de trabalho. Os valores válidos são de 0 adouble.PositiveInfinity
. - Overlays, do tipo
IReadOnlyCollection<IWindowOverlay>
, representa a coleção de sobreposições de janela. - Page, do tipo Page, indica a página que está sendo exibida pela janela. A propriedade é a propriedade de conteúdo da classe Window e, portanto, não precisa ser definida explicitamente.
- O Title, do tipo
string
, representa o título da janela. - Width, do tipo
double
, especifica a largura da janela no Windows. - X, do tipo
double
, especifica a coordenada X da janela no Windows. - Y, do tipo
double
, especifica a coordenada Y da janela no Windows.
Essas propriedades, com exceção da propriedade Overlays
, são apoiadas por objetos BindableProperty, o que significa que elas podem ser alvos de associações de dados e estilizadas.
A classe Window define os eventos a seguir:
- Created, que é gerado quando a janela é criada.
- Resumed, que é gerado quando a janela é retomada de um estado de suspensão.
- Activated, que é gerado quando a janela é ativada.
- Deactivated, que é gerado quando a janela é desativada.
- Stopped, que é gerado quando a janela é interrompida.
- Destroying, que é gerada quando a janela é destruída.
- SizeChanged, que é gerado em plataformas de área de trabalho quando a janela muda de tamanho.
- Backgrounding, com um objeto
BackgroundingEventArgs
que acompanha, que é gerado no iOS e no Mac Catalyst quando a janela é fechada ou entra em um estado de plano de fundo. Esse evento pode ser usado para persistir qualquer estadostring
à propriedadeState
do objetoBackgroundingEventArgs
, que o sistema operacional preservará até que seja hora de retomar a janela. Quando a janela é retomada, o estado é fornecido pelo argumentoIActivationState
para o métodoCreateWindow
. - DisplayDensityChanged, com um objeto
DisplayDensityChangedEventArgs
que acompanha, que é gerado no Android e no Windows quando os pontos por polegada (DPI) efetivos da janela foram alterados.
Para obter mais informações sobre os eventos do ciclo de vida e suas substituições associadas, consulte Ciclo de vida do aplicativo.
A classe Window também define os seguintes eventos de navegação modal:
- ModalPopped, com
ModalPoppedEventArgs
, que é gerado quando uma exibição é mostrada de forma modal. - ModalPopping, com
ModalPoppingEventArgs
, que é gerado quando uma exibição é exibida de forma modal. - ModalPushed, com
ModalPushedEventArgs
, que é gerado quando uma exibição é enviada de forma modal. - ModalPushing, com
ModalPushingEventArgs
, que é gerado quando uma exibição é enviada de forma modal. - PopCanceled, que é gerado quando uma exibição modal é cancelada.
A classe VisualElement tem uma propriedade Window
que expõe o objeto Window pai. Essa propriedade pode ser acessada de qualquer página, layout ou exibição para manipular objetos Window.
Criar uma janela
Por padrão, o .NET MAUI cria um objeto Window quando você define a propriedade MainPage
para um objeto Page em sua classe App
. No entanto, você também pode substituir o método CreateWindow
em sua classe App
para criar um objeto Window:
namespace MyMauiApp
{
public partial class App : Application
{
public App()
{
InitializeComponent();
MainPage = new MainPage();
}
protected override Window CreateWindow(IActivationState activationState)
{
Window window = base.CreateWindow(activationState);
// Manipulate Window object
return window;
}
}
}
Embora a classe Window tenha um construtor padrão e um construtor que aceite um argumento Page, que representa a página raiz do aplicativo, você também pode chamar o método CreateWindow
base para retornar o objeto Window .NET MAUI criado.
Por padrão, seu aplicativo .NET MAUI substitui o CreateWindow
método em sua App
classe para criar um Window objeto:
namespace MyMauiApp
{
public partial class App : Application
{
public App()
{
InitializeComponent();
}
protected override Window CreateWindow(IActivationState? activationState)
{
return new Window(new AppShell());
}
}
}
A Window classe tem um construtor padrão e um construtor que aceita um Page argumento, que representa a página raiz do aplicativo.
Além disso, você também pode criar seu próprio objeto derivado de Window:
namespace MyMauiApp
{
public class MyWindow : Window
{
public MyWindow() : base()
{
}
public MyWindow(Page page) : base(page)
{
}
// Override Window methods
}
}
A classe derivada de Windowpode ser consumida criando um objeto MyWindow
na substituição CreateWindow
na classe App
.
Independentemente de como seu objeto Window é criado, ele será o pai da página raiz em seu aplicativo.
Suporte a várias janelas
Várias janelas podem ser abertas simultaneamente no Android, iOS no iPad (iPadOS), Mac Catalyst e Windows. Isso pode ser feito criando um objeto Window e abrindo-o usando o método OpenWindow
no objeto Application
:
Window secondWindow = new Window(new MyPage());
Application.Current?.OpenWindow(secondWindow);
A coleção Application.Current.Windows
, do tipo IReadOnlyList<Window>
mantém referências a todos os objetos Window registrados com o objeto Application
.
Uma janela específica pode ser trazida para a frente no Mac Catalyst e no Windows com o método Application.Current.ActivateWindow
:
Application.Current?.ActivateWindow(secondWindow);
O Windows pode ser fechado com o método Application.Current.CloseWindow
:
// Close a specific window
Application.Current?.CloseWindow(secondWindow);
// Close the active window
Application.Current?.CloseWindow(GetParentWindow());
Importante
O suporte a várias janelas funciona no Windows sem configuração adicional. No entanto, é necessária uma configuração adicional no Android, iPadOS e no Mac Catalyst.
Configuração para Android
Para usar o suporte a várias janelas no Android, você deve alterar o modo de inicialização MainActivity
em Plataformas > Android > MainActivity.cs de LaunchMode.SingleTop
para LaunchMode.Multiple
:
using Android.App;
using Android.Content.PM;
using Android.OS;
namespace MyMauiApp;
[Activity(Theme = "@style/Maui.SplashTheme", MainLauncher = true, LaunchMode = LaunchMode.Multiple, ...)]
public class MainActivity : MauiAppCompatActivity
{
}
Configuração do iPadOS e macOS
Para usar o suporte a várias janelas no iPadOS e no Mac Catalyst, adicione uma classe chamada SceneDelegate
às pastas Platforms > iOS e Platforms > MacCatalyst:
using Foundation;
using Microsoft.Maui;
using UIKit;
namespace MyMauiApp;
[Register("SceneDelegate")]
public class SceneDelegate : MauiUISceneDelegate
{
}
Em seguida, no editor XML, abra o arquivo Platforms > iOS > Info.plist e o arquivo Platforms > MacCatalyst > Info.plist e adicione o seguinte XML ao final de cada arquivo:
<key>UIApplicationSceneManifest</key>
<dict>
<key>UIApplicationSupportsMultipleScenes</key>
<true/>
<key>UISceneConfigurations</key>
<dict>
<key>UIWindowSceneSessionRoleApplication</key>
<array>
<dict>
<key>UISceneConfigurationName</key>
<string>__MAUI_DEFAULT_SCENE_CONFIGURATION__</string>
<key>UISceneDelegateClassName</key>
<string>SceneDelegate</string>
</dict>
</array>
</dict>
</dict>
Importante
O suporte a várias janelas não funciona no iOS para iPhone.
Posicionar e dimensionar uma janela
A posição e o tamanho de uma janela podem ser definidos programaticamente para um aplicativo .NET MAUI no Windows definindo as propriedades X
, Y
, Width
e Height
em um objeto Window.
Aviso
O Mac Catalyst não dá suporte ao redimensionamento ou reposicionamento de janelas programaticamente definindo as propriedades X
, Y
, Width
e Height
.
Por exemplo, para definir a posição e o tamanho da janela na inicialização, você deve substituir o método CreateWindow
em sua classe App
e definir as propriedades X
, Y
, Width
e Height
em um objeto Window:
public partial class App : Application
{
public App()
{
InitializeComponent();
}
protected override Window CreateWindow(IActivationState activationState) =>
new Window(new AppShell())
{
Width = 700,
Height = 500,
X = 100,
Y = 100
};
}
Como alternativa, uma janela pode ser posicionada e dimensionada acessando a propriedade Window
de qualquer página, layout ou exibição. Por exemplo, o código a seguir mostra como posicionar uma janela no centro da tela:
// Get display size
var displayInfo = DeviceDisplay.Current.MainDisplayInfo;
// Center the window
Window.X = (displayInfo.Width / displayInfo.Density - Window.Width) / 2;
Window.Y = (displayInfo.Height / displayInfo.Density - Window.Height) / 2;
Para obter informações sobre como obter as métricas de tela do dispositivo, consulte Informações de exibição do dispositivo.
Catalisador Mac
O Mac Catalyst não dá suporte ao redimensionamento ou reposicionamento de janelas programaticamente. No entanto, uma solução alternativa para habilitar o redimensionamento é definir as propriedades MinimumWidth
e MaximumWidth
à largura desejada da janela e as propriedades MinimumHeight
e MaximumHeight
à altura desejada da janela. Isso dispara um redimensionamento e você pode reverter as propriedades para seus valores originais:
Window.MinimumWidth = 700;
Window.MaximumWidth = 700;
Window.MinimumHeight = 500;
Window.MaximumHeight = 500;
// Give the Window time to resize
Dispatcher.Dispatch(() =>
{
Window.MinimumWidth = 0;
Window.MinimumHeight = 0;
Window.MaximumWidth = double.PositiveInfinity;
Window.MaximumHeight = double.PositiveInfinity;
});
Desacoplar o gerenciamento de janelas da classe App
O gerenciamento de janelas pode ser dissociado da classe App
criando uma classe que implementa a interface IWindowCreator e adicionando o código de gerenciamento de janela no método CreateWindow:
public class WindowCreator : IWindowCreator
{
public Window CreateWindow(Application app, IActivationState activationState)
{
var window = new Window(new ContentPage
{
Content = new Grid
{
new Label
{
Text = "Hello from IWindowCreator",
HorizontalOptions = LayoutOptions.Center,
VerticalOptions = LayoutOptions.Center
}
}
});
return window;
}
}
Em seguida, na classe MauiProgram
, você deve registrar o tipo de gerenciamento de janela como uma dependência no contêiner de serviço do aplicativo:
builder.Services.AddSingleton<IWindowCreator, WindowCreator>();
Importante
Verifique se o código de registro especifica a interface IWindowCreator
, bem como seu tipo concreto.
Em seguida, verifique se a classe App
não define a propriedade MainPage
:
public partial class App : Application
{
public App()
{
InitializeComponent();
}
}
Desde que a interface IWindowCreator e seu tipo concreto tenham sido registrados com o contêiner de serviço do aplicativo e que a propriedade MainPage da classe Application não esteja definida, seu tipo registrado será usado para criar o Window.