Xamarin.Mac项目嵌入Xamarin.Forms页面模态窗口尺寸不生效问题排查
故障原因
当你把Xamarin.Forms生成的ViewController赋值给NSWindow的ContentViewController时,Xamarin.Forms内置的自动布局逻辑会接管窗口的内容尺寸计算:
- 你预设的NSWindow初始化尺寸仅作用于无自定义内容视图的空窗口
- 你的XAML页面(
PickInstallPath对应的ContentPage)没有明确声明期望尺寸,Xamarin.Forms没有给生成的ViewController设置PreferredContentSize,AppKit布局时就会 fallback 到极小的默认尺寸 - 删掉ContentViewController赋值后窗口恢复正常,刚好验证了是XF视图控制器的布局属性覆盖了窗口初始配置
解决方案
两种方案二选一即可:
方案1:在原生侧手动设置尺寸
在赋值ContentViewController后,显式设置ViewController的首选内容尺寸或者直接重设window的内容尺寸:
this.window = new NSWindow(new CGRect(new CGPoint(100, 100), new CGSize(680, 425)), NSWindowStyle.Closable, NSBackingStore.Buffered, false); PickInstallPath pickInstallPath = new(); var xfViewController = pickInstallPath.CreateViewController(); // 新增:设置ViewController的首选内容尺寸 xfViewController.PreferredContentSize = new CGSize(680, 425); this.window.ContentViewController = xfViewController; // 也可以额外加一句强制重设window尺寸保险 this.window.SetContentSize(new CGSize(680, 425), true); NSApplication.SharedApplication.RunModalForWindow(this.window);
方案2:在Xamarin.Forms侧声明页面尺寸
直接在PickInstallPath对应的XAML文件的根ContentPage节点添加尺寸声明:
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" x:Class="YourNamespace.PickInstallPath" <!-- 新增固定尺寸声明 --> WidthRequest="680" HeightRequest="425"> <!-- 你的页面内容 --> </ContentPage>
这样Xamarin.Forms生成ViewController的时候会自动把这两个值同步到PreferredContentSize属性,原生侧不需要额外修改。
内容的提问来源于stack exchange,提问作者Max951
相关产品推荐
相关产品推荐

