.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 类具有公开 Window 父 Window 对象的属性。 可以从任何页面、布局或视图访问此属性以作 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 不支持通过设置X、YWidth和Height属性以编程方式调整或重新定位窗口的大小。
可以通过在 Mac Catalyst 和 Windows 上设置X对象的属性WidthY和属性,以编程方式为 .NET MAUI 应用定义窗口的位置和Height大小Window。
例如,若要在启动时设置窗口位置和大小,应重写CreateWindow类中的App方法,并在对象上Window设置 X、YWidth和Height属性:
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 桌面。 其他平台忽略此代码路径。 若要重新启用按钮,请设置 IsMinimizable 并 IsMaximizable 返回 true。