Partager via


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 et double.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 et double.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 et double.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 et double.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 état string dans la propriété State de l’objet BackgroundingEventArgs, 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’argument IActivationState à la méthode CreateWindow.
  • 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.