Sdílet prostřednictvím


Okna .NET MAUI

Třída .NET Multi-Platform App UI (.NET MAUI) Window poskytuje možnost vytvářet, konfigurovat, zobrazovat a spravovat více oken.

Window definuje následující vlastnosti:

  • FlowDirection, typu FlowDirection, definuje směr, ve kterém je prvek uživatelského rozhraní okna rozložen.
  • Height, typu double, určuje výšku okna ve Windows.
  • MaximumHeight, typu doublepředstavuje maximální výšku okna na stolních platformách. Platné hodnoty jsou mezi 0 a double.PositiveInfinity.
  • MaximumWidth, typu doublepředstavuje maximální šířku okna na stolních platformách. Platné hodnoty jsou mezi 0 a double.PositiveInfinity.
  • MinimumHeight, typu double, představuje minimální výšku okna na stolních platformách. Platné hodnoty jsou mezi 0 a double.PositiveInfinity.
  • MinimumWidth, typu double, představuje minimální šířku okna na stolních platformách. Platné hodnoty jsou mezi 0 a double.PositiveInfinity.
  • Overlays, typu IReadOnlyCollection<IWindowOverlay>, představuje kolekci překryvných oken.
  • Page, typu Page, označuje stránku, která se zobrazí v okně. Tato vlastnost je vlastnost Window obsahu třídy, a proto není nutné explicitně nastavit.
  • Title, typu string, představuje název okna.
  • Width, typu double, určuje šířku okna ve Windows.
  • X, typu double, určuje souřadnici X okna ve Windows.
  • Y, typu double, určuje souřadnici Y okna ve Windows.

Tyto vlastnosti, s výjimkou Overlays vlastnosti, jsou podporovány BindableProperty objekty, což znamená, že mohou být cílem datových vazeb a styl.

Třída Window definuje následující události:

  • Created, který je vyvolán při vytvoření okna.
  • Resumed, který je vyvolán při obnovení okna ze stavu spánku.
  • Activated, který je vyvolán při aktivaci okna.
  • Deactivated, který je vyvolán při deaktivaci okna.
  • Stopped, který je vyvolán při zastavení okna.
  • Destroying, který je vyvolán při zničení okna.
  • SizeChanged, který je vyvolán na desktopových platformách při změně velikosti okna.
  • Backgrounding, s doprovodným BackgroundingEventArgs objektem, který je vyvolán v systému iOS a Mac Catalyst při zavření okna nebo vstup do stavu pozadí. Tuto událost lze použít k zachování libovolného string stavu State vlastnosti objektu BackgroundingEventArgs , který operační systém zachová, dokud nebude čas obnovit okno. Když je okno obnoveno stav je poskytován prostřednictvím IActivationState argumentu metody CreateWindow .
  • DisplayDensityChanged, s doprovodným DisplayDensityChangedEventArgs objektem, který je vyvolán v Androidu a Windows, když se změnily efektivní tečky na palec (DPI) okna.

Další informace o událostech životního cyklu a jejich přidružených přepsání najdete v tématu Životní cyklus aplikace.

Třída Window také definuje následující modální navigační události:

  • ModalPopped, s ModalPoppedEventArgs, který je vyvolán v případě, že zobrazení bylo upraveno modálně.
  • ModalPopping, s ModalPoppingEventArgs, který je vyvolán, když je zobrazení modálně přepnuto.
  • ModalPushed, s ModalPushedEventArgs, který je vyvolán po zobrazení modálně.
  • ModalPushing, s ModalPushingEventArgs, který je vyvolán při modálně nasdílení zobrazení.
  • PopCanceled, který je vyvolán při modální pop je zrušen.

Třída VisualElementWindow vlastnost, která zveřejňuje nadřazený Window objekt. K této vlastnosti lze přistupovat z libovolné stránky, rozložení nebo zobrazení pro manipulaci s Window objekty.

Vytvoření okna

Ve výchozím nastavení vytvoří .NET MAUI Window objekt při nastavení MainPage vlastnosti na Page objekt ve třídě App . Můžete však také přepsat metodu CreateWindow ve třídě App a vytvořit Window objekt:

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;
        }
    }
}

Window Zatímco třída má výchozí konstruktor a konstruktor, který přijímá Page argument, který představuje kořenovou stránku aplikace, můžete také volat základní CreateWindow metodu pro vrácení vytvořeného Window objektu .NET MAUI.

Ve výchozím nastavení aplikace .NET MAUI přepíše metodu CreateWindow Window ve vaší App třídě a vytvoří objekt:

namespace MyMauiApp
{
    public partial class App : Application
    {
        public App()
        {
            InitializeComponent();
        }

        protected override Window CreateWindow(IActivationState? activationState)
        {
            return new Window(new AppShell());
        }
    }
}

Třída Window má výchozí konstruktor a konstruktor, který přijímá Page argument, který představuje kořenovou stránku aplikace.

Kromě toho můžete také vytvořit vlastní Window-odvozený objekt:

namespace MyMauiApp
{
    public class MyWindow : Window
    {
        public MyWindow() : base()
        {
        }

        public MyWindow(Page page) : base(page)
        {
        }

        // Override Window methods
    }
}

Window-odvozenou třídu pak lze využívat vytvořením MyWindow objektu v přepsání CreateWindow ve vaší App třídě.

Bez ohledu na to, jak se objekt Window vytvoří, bude nadřazenou stránkou v aplikaci.

Podpora více oken

V Androidu, iOSu (iPadOS), Mac Catalyst a Windows lze současně otevřít více oken. Toho lze dosáhnout vytvořením objektu Window a jeho otevřením pomocí OpenWindow metody na objektu Application :

Window secondWindow = new Window(new MyPage());
Application.Current?.OpenWindow(secondWindow);

Kolekce Application.Current.Windows typu IReadOnlyList<Window> udržuje odkazy na všechny Window objekty, které jsou registrovány s objektem Application .

Konkrétní okno lze přenést na přední straně systému Mac Catalyst a Windows metodou Application.Current.ActivateWindow :

Application.Current?.ActivateWindow(secondWindow);

Systém Windows lze zavřít metodou Application.Current.CloseWindow :

// Close a specific window
Application.Current?.CloseWindow(secondWindow);

// Close the active window
Application.Current?.CloseWindow(GetParentWindow());

Důležité

Podpora více oken funguje ve Windows bez další konfigurace. Na Androidu, iPadOS a Mac Catalyst se ale vyžaduje další konfigurace.

Konfigurace Androidu

Pokud chcete používat podporu více oken v Androidu, musíte změnit MainActivity režim spuštění v platformách Android > > MainActivity.cs z 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
{
}

Konfigurace iPadOS a macOS

Pokud chcete používat podporu více oken v systémech iPadOS a Mac Catalyst, přidejte třídu pojmenovanou SceneDelegate do složek Platforms > iOS a Platforms > MacCatalyst :

using Foundation;
using Microsoft.Maui;
using UIKit;

namespace MyMauiApp;

[Register("SceneDelegate")]
public class SceneDelegate : MauiUISceneDelegate
{
}

Potom v editoru XML otevřete soubor Platforms > iOS > Info.plist a soubor Platforms > MacCatalyst > Info.plist a na konec každého souboru přidejte následující XML:

<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>

Důležité

Podpora více oken nefunguje v iOSu pro iPhone.

Umístění a velikost okna

Umístění a velikost okna lze programově definovat pro aplikaci .NET MAUI ve Windows nastavením X, Y, Widtha Height vlastností objektu Window .

Upozorňující

Mac Catalyst nepodporuje změnu velikosti nebo přemístění oken programově nastavením X, Y, Widtha Height vlastnosti.

Pokud chcete například nastavit umístění a velikost okna při spuštění, měli byste přepsat metodu CreateWindow ve třídě App a nastavit X, Y, Widtha Height vlastnosti objektu 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
        };
}

Případně můžete okno umístit a změnit jeho velikost tak, že se k vlastnosti dostanete Window z libovolné stránky, rozložení nebo zobrazení. Například následující kód ukazuje, jak umístit okno do středu obrazovky:

// 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;

Informace o získání metrik obrazovky zařízení najdete v tématu Informace o zobrazení zařízení.

Mac Catalyst

Mac Catalyst nepodporuje změnu velikosti ani přemístění oken programově. Alternativním řešením pro povolení změny velikosti je nastavení MinimumWidth a MaximumWidth vlastností na požadovanou šířku okna a MinimumHeight MaximumHeight vlastnosti na požadovanou výšku okna. Tím se aktivuje změna velikosti a vlastnosti pak můžete vrátit zpět k původním hodnotám:

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;
});

Oddělení správy oken od třídy aplikace

Správu oken lze oddělit od App třídy vytvořením třídy, která implementuje IWindowCreator rozhraní, a přidáním kódu pro správu oken do CreateWindow metody:

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;
    }
}

MauiProgram Ve třídě byste pak měli typ správy oken zaregistrovat jako závislost v kontejneru služby aplikace:

builder.Services.AddSingleton<IWindowCreator, WindowCreator>();

Důležité

Ujistěte se, že registrační kód určuje IWindowCreator rozhraní i jeho konkrétní typ.

Pak se ujistěte, že vaše App třída nenastaví MainPage vlastnost:

public partial class App : Application
{
    public App()
    {
        InitializeComponent();
    }
}

Za předpokladu IWindowCreator , že rozhraní a jeho konkrétní typ byly registrovány v kontejneru služby aplikace a že MainPage vlastnost Application třídy není nastavena, váš registrovaný typ se použije k vytvoření Window.