Поделиться через


Окна .NET MAUI

Класс многоплатформенного пользовательского интерфейса приложений .NET (.NET MAUI) Window предоставляет возможность создавать, настраивать, отображать и управлять несколькими окнами.

Window определяет следующие свойства:

  • FlowDirectionFlowDirectionТип , определяет направление, в котором выложен элемент пользовательского интерфейса окна.
  • HeightdoubleТип , указывает высоту окна в Windows.
  • MaximumHeightdoubleТип , представляет максимальную высоту окна на настольных платформах. Допустимые значения : от 0 до double.PositiveInfinity.
  • MaximumWidthdoubleТип , представляет максимальную ширину окна на настольных платформах. Допустимые значения : от 0 до double.PositiveInfinity.
  • MinimumHeightdoubleТип , представляет минимальную высоту окна на настольных платформах. Допустимые значения : от 0 до double.PositiveInfinity.
  • MinimumWidthdoubleТип , представляет минимальную ширину окна на настольных платформах. Допустимые значения : от 0 до double.PositiveInfinity.
  • OverlaysIReadOnlyCollection<IWindowOverlay>Тип , представляет коллекцию наложений окон.
  • Page, тип Page, указывает страницу, отображаемую окном. Это свойство является свойством содержимого Window класса, поэтому не требуется явно задавать.
  • TitlestringТип , представляет заголовок окна.
  • WidthdoubleТип , указывает ширину окна в Windows.
  • XdoubleТип , указывает координату X окна в Windows.
  • YdoubleТип , указывает координату Y окна в Windows.

Эти свойства, за исключением Overlays свойства, поддерживаются BindableProperty объектами, что означает, что они могут быть целевыми объектами привязок данных и стилем.

Класс Window определяет следующие события:

  • Created, который возникает при создании окна.
  • Resumed, который возникает при возобновлении окна из спящего состояния.
  • Activated, который возникает при активации окна.
  • Deactivated, который возникает при деактивации окна.
  • Stopped, который возникает при остановке окна.
  • Destroying, который поднимается при уничтожении окна.
  • SizeChanged, который возникает на настольных платформах при изменении размера окна.
  • Backgrounding, с сопутствующим BackgroundingEventArgs объектом, который вызывается в iOS и Mac Catalyst при закрытии окна или входит в фоновое состояние. Это событие можно использовать для сохранения любого string состояния в State свойстве BackgroundingEventArgs объекта, который ОС будет сохранять до тех пор, пока не придет время возобновить окно. Когда окно возобновляется, состояние предоставляется с помощью аргумента IActivationState CreateWindow метода.
  • DisplayDensityChanged, с DisplayDensityChangedEventArgs сопутствующим объектом, который поднимается на Android и Windows, когда эффективные точки на дюйм (DPI) окна изменились.

Дополнительные сведения о событиях жизненного цикла и связанных с ними переопределениях см. в разделе "Жизненный цикл приложений".

Класс Window также определяет следующие модальные события навигации:

  • ModalPopped, с ModalPoppedEventArgs, который вызывается, когда представление было положено модально.
  • ModalPopping, с ModalPoppingEventArgs, которое возникает при модальном появлении представления.
  • ModalPushed, с ModalPushedEventArgs, который поднимается после того, как представление было изменено модально.
  • ModalPushing, с ModalPushingEventArgs, который вызывается при модальном нажатии представления.
  • PopCanceled, который возникает при отмене модального поп-окна.

Класс VisualElement имеет свойство, которое предоставляет родительский Window Window объект. К этому свойству можно получить доступ из любой страницы, макета или представления для управления Window объектами.

Создание окна

По умолчанию .NET MAUI создает Window объект при настройке MainPage свойства объекту Page в App классе. Однако можно также переопределить CreateWindow метод в App классе, чтобы создать 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;
        }
    }
}

Window Хотя класс имеет конструктор по умолчанию и конструктор, который принимает Page аргумент, который представляет корневую страницу приложения, можно также вызвать базовый CreateWindow метод для возврата созданного Window объекта .NET MAUI.

По умолчанию приложение .NET MAUI переопределяет CreateWindow метод в App классе для создания Window объекта:

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

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

Класс Window имеет конструктор по умолчанию и конструктор, который принимает Page аргумент, который представляет корневую страницу приложения.

Кроме того, можно также создать собственный производный Windowобъект:

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

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

        // Override Window methods
    }
}

Затем Windowпроизводный класс можно использовать путем создания MyWindow объекта в CreateWindow переопределении в App классе.

Независимо от того, как Window создается объект, он будет родительским элементом корневой страницы в приложении.

Поддержка нескольких окон

Одновременно можно открыть несколько окон в Android, iOS на iPad (iPadOS), Mac Catalyst и Windows. Это можно сделать, создав Window объект и открыв его с помощью OpenWindow метода в объекте Application :

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

Коллекция Application.Current.Windows типа IReadOnlyList<Window> сохраняет ссылки на все Window объекты, зарегистрированные в объекте Application .

Определенное окно можно принести на передний план в Mac Catalyst и Windows с Application.Current.ActivateWindow помощью метода:

Application.Current?.ActivateWindow(secondWindow);

Windows можно закрыть с Application.Current.CloseWindow помощью метода:

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

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

Внимание

Поддержка нескольких окон работает в Windows без дополнительной настройки. Однако дополнительная конфигурация необходима в Android, iPadOS и Mac Catalyst.

Конфигурация Android

Чтобы использовать поддержку с несколькими окнами в Android, необходимо изменить MainActivity режим запуска в Платформах > Android > MainActivity.cs на 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
{
}

Конфигурация iPadOS и macOS

Чтобы использовать поддержку с несколькими окнами в iPadOS и Mac Catalyst, добавьте класс с именем SceneDelegate в папки Platform > iOS и Platform > MacCatalyst:

using Foundation;
using Microsoft.Maui;
using UIKit;

namespace MyMauiApp;

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

Затем в редакторе XML откройте файл Platform iOS > Info.plist и файл MacCatalyst > Info.plist платформ > > и добавьте следующий 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>

Внимание

Поддержка нескольких окон не работает в iOS для iPhone.

Расположение и размер окна

Положение и размер окна можно программно определить для приложения .NET MAUI в Windows, задав Xдля объекта свойства и Height YWidthсвойства.Window

Предупреждение

Mac Catalyst не поддерживает изменение размера или изменение положения окон программным способом, задав XYWidthсвойства , и Height свойства.

Например, чтобы задать положение окна и размер при запуске, необходимо переопределить метод в App классе и задать свойства объекта , WidthYа Height также свойстваXWindow:CreateWindow

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

Кроме того, окно можно разместить и размер, доступ к свойству Window с любой страницы, макета или представления. Например, в следующем коде показано, как разместить окно в центре экрана:

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

Сведения о получении метрик экрана устройства см. в разделе "Сведения о отображении устройства".

Mac Catalyst

Mac Catalyst не поддерживает изменение размера или изменение положения окон программным способом. Однако обходной путь для включения изменения размера заключается в том, чтобы задать MinimumWidth нужный ширину окна MinimumHeight MaximumHeight и MaximumWidth свойства для требуемой высоты окна. Это приведет к возникновению изменения размера, и затем можно вернуть свойства обратно к их исходным значениям:

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

Разделение управления окнами из класса App

Управление окнами можно отделить от App класса, создав класс, реализующий IWindowCreator интерфейс, и добавив код управления окнами в 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;
    }
}

Затем в MauiProgram классе необходимо зарегистрировать тип управления окнами в качестве зависимости в контейнере службы приложения:

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

Внимание

Убедитесь, что код регистрации указывает IWindowCreator интерфейс, а также его конкретный тип.

Затем убедитесь, что App класс не задает MainPage свойство:

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

При условии, что IWindowCreator интерфейс и его конкретный тип были зарегистрированы в контейнере службы приложения, и что MainPage свойство Application класса не задано, зарегистрированный тип будет использоваться для создания Window.