窗口

.NET 多平台应用 UI (.NET MAUI) Window 类提供创建、配置、显示和管理多个窗口的功能。

Window 定义以下属性:

  • FlowDirection类型 FlowDirection,定义窗口的 UI 元素布局的方向。
  • 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,指定 Windows 上窗口的 X 坐标。
  • Y类型 double,指定 Windows 上窗口的 Y 坐标。

这些属性(属性除外 Overlays )由 BindableProperty 对象提供支持,这意味着这些属性可以是数据绑定的目标,并设置样式。

Window 类定义以下事件:

  • Created,在创建窗口时引发。
  • Resumed,当窗口从睡眠状态恢复时引发。
  • Activated,在激活窗口时引发。
  • Deactivated,在停用窗口时引发。
  • Stopped,在窗口停止时引发。
  • Destroying,在窗口被销毁时引发。
  • SizeChanged,当窗口更改大小时,将在桌面平台上引发。
  • Backgrounding,附带的对象 BackgroundingEventArgs ,当窗口关闭或进入背景状态时,iOS 和 Mac Catalyst 上会引发该对象。 此事件可用于将任何string状态保存到对象的属性BackgroundingEventArgs,OS 将保留该状态State,直到恢复窗口为止。 恢复窗口后,状态将通过 IActivationState 方法的参数 CreateWindow 提供。
  • DisplayDensityChanged,附带的对象 DisplayDensityChangedEventArgs ,当窗口的有效点/英寸(DPI)发生更改时,在 Android 和 Windows 上引发。

有关生命周期事件及其关联替代的详细信息,请参阅 应用生命周期

Window 类还定义了以下模式导航事件:

  • ModalPopped,当 ModalPoppedEventArgs视图已模式弹出时,将引发该视图。
  • ModalPopping,当 ModalPoppingEventArgs视图以模式弹出时,将引发该视图。
  • ModalPushed,其中 ModalPushedEventArgs,在以模式方式推送视图后引发。
  • ModalPushing,其中 ModalPushingEventArgs,在模式推送视图时引发。
  • PopCanceled,在取消模式弹出时引发。

VisualElement 类具有公开 WindowWindow 对象的属性。 可以从任何页面、布局或视图访问此属性以作 Window 对象。

创建窗口

默认情况下,当你将MainPage属性设置为类中的App对象时,.NET MAUI 会创建一个WindowPage对象。 但是,还可以替代 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方法以返回 .NET MAUI 创建Window的对象。

默认情况下,.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然后,可以通过在类中的CreateWindowApp重写中创建对象来使用 MyWindow -derived 类。

无论对象是如何 Window 创建的,它都将是应用中根页的父级。

多窗口支持

可以在 Android、iPad 上的 iOS、Mac Catalyst 和 Windows 上同时打开多个窗口。 可以通过创建对象Window并使用对象上的Application方法打开它OpenWindow来实现此目的:

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

类型的Application.Current.Windows集合IReadOnlyList<Window>维护对向对象注册Application的所有Window对象的引用。

可以使用以下方法将特定窗口引入 Mac Catalyst 和 Windows Application.Current.ActivateWindow 的前面:

Application.Current?.ActivateWindow(secondWindow);

可以使用以下方法关闭 Application.Current.CloseWindow Windows:

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

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

重要

多窗口支持在 Windows 上工作,无需其他配置。 但是,Android、iPadOS 和 Mac Catalyst 需要其他配置。

Android 配置

若要在 Android 上使用多窗口支持,必须在 Android > 平台 > MainActivity.cs中将启动模式更改为LaunchMode.SingleTopMainActivityLaunchMode.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平台 > iOS平台 > MacCatalyst 文件夹的类:

using Foundation;
using Microsoft.Maui;
using UIKit;

namespace MyMauiApp;

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

然后,在 XML 编辑器中,打开 Platforms iOS > Info.plist 文件和 Platforms >> 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 for iPhone。

调整窗口的位置和大小

可以通过在 Windows 上设置X对象的属性WidthY和属性,以编程方式为 Windows 上的 .NET MAUI 应用定义窗口的位置和Height大小Window

警告

Mac Catalyst 不支持通过设置XYWidthHeight属性以编程方式调整或重新定位窗口的大小。

可以通过在 Mac Catalyst 和 Windows 上设置X对象的属性WidthY和属性,以编程方式为 .NET MAUI 应用定义窗口的位置和Height大小Window

例如,若要在启动时设置窗口位置和大小,应重写CreateWindow类中的App方法,并在对象上Window设置 XYWidthHeight属性:

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 类分离窗口管理

通过创建实现IWindowCreator接口的类并在方法中添加窗口管理代码CreateWindow,可以将窗口管理与类分离App

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该类型。

启用或禁用 Windows 上的最小化和最大化按钮

在 Windows 上,可以启用或禁用窗口上的最小化和最大化按钮。 这可以通过检索基础 WinUI 窗口并调整其演示者属性来实现。

以下示例同时禁用最小化和最大化按钮:

#if WINDOWS
using Microsoft.Maui.Platform; // MauiWinUIWindow
using Microsoft.UI.Windowing;  // AppWindow, OverlappedPresenter

public static void ConfigureWindowButtons(Window window)
{
    var nativeWindow = (MauiWinUIWindow)window.Handler.PlatformView;
    var appWindow = nativeWindow.AppWindow;

    if (appWindow.Presenter is OverlappedPresenter presenter)
    {
        presenter.IsMinimizable = false;
        presenter.IsMaximizable = false;
    }
}
#endif

在应用启动期间( ConfigureWindowButtons 例如在创建 Window in CreateWindow后)或显示辅助窗口时调用。

注释

这些属性仅适用于 Windows 桌面。 其他平台忽略此代码路径。 若要重新启用按钮,请设置 IsMinimizableIsMaximizable 返回 true