.NET MAUI Mac Catalyst:点击红色关闭按钮最小化到Dock
在Mac Catalyst的.NET MAUI中实现关闭按钮最小化到Dock的方案
要解决点击红色关闭按钮直接退出应用的问题,需通过Mac Catalyst的原生NSWindow API拦截关闭事件并替换为最小化操作,具体步骤如下:
1. 阻止应用在最后一个窗口关闭时退出
在Platforms/MacCatalyst/AppDelegate.cs中重写ApplicationShouldTerminateAfterLastWindowClosed方法,返回false以保留应用进程:
public override bool ApplicationShouldTerminateAfterLastWindowClosed(UIApplication application) { return false; }
2. 拦截窗口关闭事件并执行最小化
创建自定义的NSWindowDelegate子类,重写窗口关闭判断方法,将关闭操作替换为最小化:
public class CustomWindowDelegate : NSWindowDelegate { public override bool WindowShouldClose(NSObject sender) { var nsWindow = sender as NSWindow; nsWindow?.Miniaturize(this); // 将窗口最小化到Dock return false; // 阻止窗口实际关闭 } }
3. 为MAUI窗口绑定自定义Delegate
在MAUI窗口创建完成后,获取对应的原生NSWindow并绑定上述Delegate。推荐使用更可靠的窗口创建事件绑定方式:
在App.xaml.cs中重写OnWindowCreated方法,针对Mac Catalyst平台处理:
protected override void OnWindowCreated(Microsoft.Maui.Controls.Window window) { base.OnWindowCreated(window); #if MACCATALYST if (window.Handler.PlatformView is UIKit.UIWindow uiWindow) { if (uiWindow.WindowScene?.Window is NSWindow nsWindow) { nsWindow.Delegate = new Platforms.MacCatalyst.CustomWindowDelegate(); } } #endif }
为什么之前的方案无效?
- 隐藏
UIWindow仅让窗口不可见,但不会触发Dock的最小化状态和视觉反馈; - 应用状态通知(如
WillResignActiveNotification)无法区分“点击关闭按钮”和“切换到其他应用”的场景,无法精准触发最小化; - 拦截通用状态通知无法替代NSWindow层面的关闭事件拦截,原生Mac应用的最小化逻辑是通过NSWindow的关闭委托实现的。
内容的提问来源于stack exchange,提问作者Usman Qadeer
相关产品推荐
相关产品推荐

