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
相关产品推荐
相关产品推荐

