Fenêtres .NET MAUI
La classe Window de .NET Multi-Platform App UI (.NET MAUI) permet de créer, configurer, afficher et gérer plusieurs fenêtres.
Window définit les propriétés suivantes :
- FlowDirection, de type
FlowDirection
, définit la direction dans laquelle l’élément d’interface utilisateur de la fenêtre est disposé. - Height, de type
double
, spécifie la hauteur de la fenêtre sur Windows. - MaximumHeight, de type
double
, représente la hauteur maximale de la fenêtre sur les plateformes de bureau. Les valeurs valides sont comprises entre 0 etdouble.PositiveInfinity
. - MaximumWidth, de type
double
, représente la largeur maximale de la fenêtre sur les plateformes de bureau. Les valeurs valides sont comprises entre 0 etdouble.PositiveInfinity
. - MinimumHeight, de type
double
, représente la hauteur minimale de la fenêtre sur les plateformes de bureau. Les valeurs valides sont comprises entre 0 etdouble.PositiveInfinity
. - MinimumWidth, de type
double
, représente la largeur minimale de la fenêtre sur les plateformes de bureau. Les valeurs valides sont comprises entre 0 etdouble.PositiveInfinity
. - Overlays, de type
IReadOnlyCollection<IWindowOverlay>
, représente la collection de superpositions de fenêtres. - Page, de type Page, indique la page affichée par la fenêtre. Il s’agit de la propriété de contenu de la classe Window et n’a donc pas besoin d’être explicitement définie.
- Title, de type
string
, représente le titre de la fenêtre. - Width, de type
double
, spécifie la largeur de la fenêtre sur Windows. - X, de type
double
, spécifie la coordonnée X de la fenêtre sur Windows. - Y, de type
double
, spécifie la coordonnée Y de la fenêtre sur Windows.
Ces propriétés, à l’exception de la propriété Overlays
, s’appuient sur des objets BindableProperty, ce qui signifie qu’elles peuvent faire l’objet de liaisons de données et être mises en forme.
La classe Window définit les événements suivants :
- Created, qui est déclenché lors de la création de la fenêtre.
- Resumed, qui est déclenché lorsque la fenêtre est reprise à partir d’un état de veille.
- Activated, qui est déclenché lors de l’activation de la fenêtre.
- Deactivated, qui est déclenché lors de la désactivation de la fenêtre.
- Stopped, qui est déclenché lors de l’arrêt de la fenêtre.
- Destroying, qui est déclenché lors de la destruction de la fenêtre.
- SizeChanged, qui est déclenché sur les plateformes de bureau lorsque la fenêtre change de taille.
- Backgrounding, ainsi qu’un objet
BackgroundingEventArgs
associé, qui est déclenché sur iOS et Mac Catalyst lorsque la fenêtre est fermée ou entre dans un état d’arrière-plan. Cet événement peut être utilisé pour conserver un étatstring
dans la propriétéState
de l’objetBackgroundingEventArgs
, que le système d’exploitation conserve jusqu’au moment de reprendre la fenêtre. Lorsque la fenêtre est reprise, l’état est fourni par l’argumentIActivationState
à la méthodeCreateWindow
. - DisplayDensityChanged, ainsi qu’un objet
DisplayDensityChangedEventArgs
associé, qui est déclenché sur Android et Windows lorsque les points par pouce (PPP) effectifs pour la fenêtre ont changé.
Pour plus d’informations sur les événements de cycle de vie et leurs remplacements associés, consultez Cycle de vie des applications.
La classe Window définit également les événements de navigation modale suivants :
- ModalPopped, avec
ModalPoppedEventArgs
, qui est déclenché lorsqu’une vue est présentée en affichage modal. - ModalPopping, avec
ModalPoppingEventArgs
, qui est déclenché lorsqu’une vue est présentée en affichage modal. - ModalPushed, avec
ModalPushedEventArgs
, qui est déclenché lorsqu’une vue est poussée en affichage modal. - ModalPushing, avec
ModalPushingEventArgs
, qui est déclenché lorsqu’une vue est poussée en affichage modal. - PopCanceled, qui est déclenché lorsqu’une poussée en affichage modal est annulée.
La classe VisualElement a une propriété Window
qui expose l’objet Window parent. Cette propriété est accessible à partir de n’importe quelle page, mise en page ou vue, pour manipuler des objets Window.
Créer un objet Fenêtre
Par défaut, .NET MAUI crée un objet Window lorsque vous définissez la propriété MainPage
sur un objet Page dans votre classe App
. Toutefois, vous pouvez également remplacer la méthode CreateWindow
dans votre classe App
pour créer un objet 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;
}
}
}
Alors que la classe Window a un constructeur par défaut et un constructeur qui accepte un argument Page, qui représente la page racine de l’application, vous pouvez également appeler la méthode CreateWindow
de base pour renvoyer l’objet Window créé par .NET MAUI.
Par défaut, votre application MAUI .NET remplace la CreateWindow
méthode de votre App
classe pour créer un Window objet :
namespace MyMauiApp
{
public partial class App : Application
{
public App()
{
InitializeComponent();
}
protected override Window CreateWindow(IActivationState? activationState)
{
return new Window(new AppShell());
}
}
}
La Window classe a un constructeur par défaut et un constructeur qui accepte un Page argument, qui représente la page racine de l’application.
En outre, vous pouvez également créer votre propre objet dérivé de Window :
namespace MyMauiApp
{
public class MyWindow : Window
{
public MyWindow() : base()
{
}
public MyWindow(Page page) : base(page)
{
}
// Override Window methods
}
}
La classe dérivée de Window peut ensuite être consommée en créant un objet MyWindow
dans le remplacement CreateWindow
de votre classe App
.
Quelle que soit la façon dont votre objet Window est créé, il sera le parent de la page racine de votre application.
Prise en charge de plusieurs fenêtres
Plusieurs fenêtres peuvent être ouvertes simultanément sur Android, iOS sur iPad (iPadOS), Mac Catalyst et Windows. Pour ce faire, créez un objet Window et ouvrez-le à l’aide de la méthode OpenWindow
sur l’objet Application
:
Window secondWindow = new Window(new MyPage());
Application.Current?.OpenWindow(secondWindow);
La collection Application.Current.Windows
, de type IReadOnlyList<Window>
, maintient les références à tous les objets Window inscrits auprès de l’objet Application
.
Une fenêtre spécifique peut être amenée au premier plan sur Mac Catalyst et Windows avec la méthode Application.Current.ActivateWindow
:
Application.Current?.ActivateWindow(secondWindow);
Windows peut être fermé avec la méthode Application.Current.CloseWindow
:
// Close a specific window
Application.Current?.CloseWindow(secondWindow);
// Close the active window
Application.Current?.CloseWindow(GetParentWindow());
Important
La prise en charge de plusieurs fenêtres fonctionne sur Windows sans configuration supplémentaire. Toutefois, une configuration supplémentaire est requise sur iPadOS et Mac Catalyst.
Configuration Android
Pour utiliser la prise en charge de plusieurs fenêtres sur Android, vous devez modifier le mode de lancement MainActivity
dans Plateformes > Android > MainActivity.cs de LaunchMode.SingleTop
à 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
{
}
Configuration iPadOS et macOS
Pour utiliser la prise en charge de plusieurs fenêtres sur iPadOS et Mac Catalyst, ajoutez une classe nommée SceneDelegate
aux dossiers Platforms > iOS et Platforms > MacCatalyst :
using Foundation;
using Microsoft.Maui;
using UIKit;
namespace MyMauiApp;
[Register("SceneDelegate")]
public class SceneDelegate : MauiUISceneDelegate
{
}
Ensuite, dans l’éditeur XML, ouvrez le fichier Platforms > iOS > Info.plist et le fichier Platforms > MacCatalyst > Info.plist et ajoutez le code XML suivant à la fin de chaque fichier :
<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>
Important
La prise en charge de plusieurs fenêtres ne fonctionne pas sur iOS pour iPhone.
Positionner et dimensionner un objet Fenêtre
La position et la taille d’une fenêtre peuvent être définies par programmation pour une application .NET MAUI sur Windows en définissant les propriétés X
, Y
, Width
et Height
sur un objet Window.
Avertissement
Mac Catalyst ne prend pas en charge le redimensionnement ou le repositionnement des fenêtres par programmation en définissant les propriétés X
, Y
, Width
et Height
.
Par exemple, pour définir la position et la taille de la fenêtre lors du lancement, vous devez remplacer la méthode CreateWindow
dans votre classe App
et définir les propriétés X
, Y
, Width
et Height
propriétés sur un objet 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
};
}
Vous pouvez également positionner et dimensionner une fenêtre en accédant à la propriété Window
à partir de n’importe quelle page, mise en page ou vue. Par exemple, le code suivant montre comment positionner une fenêtre au centre de l’écran :
// 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;
Pour plus d’informations sur l’obtention des métriques d’écran de l’appareil, consultez Informations d’affichage de l’appareil.
Mac Catalyst
Mac Catalyst ne prend pas en charge le redimensionnement ou le repositionnement des fenêtres par programmation. Toutefois, une solution de contournement pour permettre le redimensionnement consiste à définir les propriétés MinimumWidth
et MaximumWidth
sur la largeur souhaitée de la fenêtre, ainsi que les propriétés MinimumHeight
et MaximumHeight
sur la hauteur souhaitée de la fenêtre. Cela déclenche un redimensionnement, après quoi vous pouvez rétablir les propriétés à leurs valeurs d’origine :
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;
});
Dissocier la gestion des fenêtres de la classe d’application
La gestion des fenêtres peut être dissociée de la classe App
en créant une classe qui implémente l’interface IWindowCreator et en ajoutant votre code de gestion des fenêtres dans la méthode 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;
}
}
Ensuite, dans la classe MauiProgram
, vous devez inscrire votre type de gestion des fenêtres en tant que dépendance dans le conteneur de service de l’application :
builder.Services.AddSingleton<IWindowCreator, WindowCreator>();
Important
Vérifiez que votre code d’inscription spécifie l’interface IWindowCreator
ainsi que son type concret.
Vérifiez ensuite que votre classe App
ne définit pas la propriété MainPage
:
public partial class App : Application
{
public App()
{
InitializeComponent();
}
}
À condition que l’interface IWindowCreator et son type concret aient été inscrits auprès du conteneur de service de l’application et que la propriété MainPage de la classe Application n’est pas définie, votre type inscrit sera utilisé pour créer le Window.