Окна .NET MAUI
Класс многоплатформенного пользовательского интерфейса приложений .NET (.NET MAUI) Window предоставляет возможность создавать, настраивать, отображать и управлять несколькими окнами.
Window определяет следующие свойства:
- FlowDirection
FlowDirection
Тип , определяет направление, в котором выложен элемент пользовательского интерфейса окна. - Height
double
Тип , указывает высоту окна в Windows. - MaximumHeight
double
Тип , представляет максимальную высоту окна на настольных платформах. Допустимые значения : от 0 доdouble.PositiveInfinity
. - MaximumWidth
double
Тип , представляет максимальную ширину окна на настольных платформах. Допустимые значения : от 0 доdouble.PositiveInfinity
. - MinimumHeight
double
Тип , представляет минимальную высоту окна на настольных платформах. Допустимые значения : от 0 доdouble.PositiveInfinity
. - MinimumWidth
double
Тип , представляет минимальную ширину окна на настольных платформах. Допустимые значения : от 0 доdouble.PositiveInfinity
. - Overlays
IReadOnlyCollection<IWindowOverlay>
Тип , представляет коллекцию наложений окон. - Page, тип Page, указывает страницу, отображаемую окном. Это свойство является свойством содержимого Window класса, поэтому не требуется явно задавать.
- Title
string
Тип , представляет заголовок окна. - Width
double
Тип , указывает ширину окна в Windows. - X
double
Тип , указывает координату X окна в Windows. - Y
double
Тип , указывает координату 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.
Кроме того, можно также создать собственный производный 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
Y
Width
свойства.Window
Предупреждение
Mac Catalyst не поддерживает изменение размера или изменение положения окон программным способом, задав X
Y
Width
свойства , и Height
свойства.
Например, чтобы задать положение окна и размер при запуске, необходимо переопределить метод в App
классе и задать свойства объекта , Width
Y
а Height
также свойстваX
Window: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.