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

Mac Catalyst(MAUI)窗口尺寸与分辨率不匹配原因及全屏设置方法

问题成因

Mac Catalyst 平台的UI布局单位是布局点(Point),不是屏幕物理像素,直接把物理分辨率1980×1080作为窗口尺寸赋值无法达到预期效果,核心原因有三点:

  • 系统会固定保留顶部菜单栏的显示区域,默认占24左右的布局点高度,如果用户未开启Dock栏自动隐藏,Dock也会占用对应方向的屏幕空间,直接写死1080高度会超出系统允许的窗口最大可用高度,被系统自动截断限制。
  • 原代码设置SizeRestrictions的时机过早,此时WindowScene还未完成初始化,配置的尺寸限制不会在窗口首次渲染时生效。
  • 不同设备的视网膜缩放系数、用户自定义的Dock尺寸/位置、菜单栏自动隐藏设置都会改变实际可用的窗口尺寸,硬编码固定分辨率值完全没有适配性。
正确实现方案

获取正确的可用窗口尺寸

禁止硬编码分辨率数值,通过系统API实时获取当前屏幕的可用布局空间:

  • UIWindowScene.Screen.Bounds:当前屏幕的总布局点尺寸,对应全屏幕(含系统UI区域)的大小
  • UIWindowScene.Screen.ApplicationFrame:扣除顶部菜单栏、Dock栏等系统保留区域后的可用工作区尺寸,也就是普通窗口能达到的最大非全屏模式尺寸

实现打开自动占满全屏的代码

修正设置时机,等WindowScene激活完成后再配置窗口属性,参考代码如下:

Microsoft.Maui.Handlers.WindowHandler.Mapper.AppendToMapping(
    nameof(IWindow), (handler, view) =>
    {
        var platformWindow = handler.PlatformView;
        platformWindow.WindowScene.DidActivate += (sender, _) =>
        {
            var windowScene = (UIWindowScene)sender;
            // 取可用工作区尺寸,窗口打开后自动占满除系统UI外的所有可用空间
            var targetFrame = windowScene.Screen.ApplicationFrame;
            
            // 赋值窗口尺寸
            platformWindow.Frame = targetFrame;
            
            // 可选:如果需要锁定窗口大小不允许用户拖拽缩放,放开以下注释即可
            // windowScene.SizeRestrictions.MinimumSize = targetFrame.Size;
            // windowScene.SizeRestrictions.MaximumSize = targetFrame.Size;

            // 如果要实现macOS原生独立空间全屏(自动隐藏菜单栏、Dock),
            // 不需要手动计算尺寸,直接替换上面的尺寸设置逻辑为以下代码
            // platformWindow.ToggleFullScreen(null);
        };
    });

注意事项

  • 适配多显示器场景时,不要用UIScreen.MainScreen取屏幕尺寸,要从当前窗口所属的WindowScene上读取对应的Screen属性,避免窗口在副屏打开时尺寸匹配错误。
  • 不要在窗口构造、Handler映射的同步阶段设置尺寸,此时场景相关API还未完成初始化,拿到的屏幕尺寸、场景状态都不是最终有效值。

内容的提问来源于stack exchange,提问作者Billi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 09:24:14