You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 18:52:14