Xamarin.Forms默认MasterDetail模板中Application.Current.MainPage为空问题咨询
嘿,我一眼就瞅出问题所在了——你的Application.Current.MainPage实际是NavigationPage类型,不是你以为的MainPage,所以用as MainPage转换自然会返回null。
看你App.xaml.cs里的这段代码:
MainPage = new NavigationPage( new MainPage());
你给默认的MainPage(本身就是MasterDetailPage)额外套了一层NavigationPage,这就导致当你在MenuPage里尝试把Application.Current.MainPage转成MainPage时,类型不匹配,转换失败返回null。
两种解决思路,选一个就行:
思路一:去掉外层NavigationPage(推荐,贴合默认模板设计)
默认的MasterDetail模板本身就自带页面切换的导航逻辑,完全不需要额外套NavigationPage。修改App.xaml.cs的构造函数:
public App() { InitializeComponent(); // 直接设置MainPage,去掉外层的NavigationPage包装 MainPage = new MainPage(); }
改完之后,Application.Current.MainPage就是正经的MainPage实例,RootPage属性就能正常拿到对象,菜单导航的逻辑也能正常跑起来。
思路二:从NavigationPage里取出嵌套的MainPage
如果你确实有特殊需求必须保留外层的NavigationPage,可以修改MenuPage里的RootPage属性,先拿到NavigationPage,再取它的当前页面:
MainPage RootPage { get => (Application.Current.MainPage as NavigationPage)?.CurrentPage as MainPage; }
不过这种方式要注意,得确保NavigationPage的CurrentPage始终是MainPage,不然还是可能返回null,所以更推荐第一种思路。
额外碎碎念
默认的MasterDetail模板里,MainPage本身就是MasterDetailPage,它的NavigateFromMenu方法已经帮你处理了Detail页面的切换逻辑,额外加NavigationPage反而会破坏原有结构,这就是你按默认模板开发却出问题的核心原因啦~
内容的提问来源于stack exchange,提问作者JL1

