Xamarin.Forms UWP启动问题:NavigationPage主页面与ToolbarItem异常
嘿,别担心,这都是Xamarin.Forms开发初期很容易遇到的基础问题,我来帮你逐一梳理清楚~
问题1:使用NavigationPage时,两个页面的OnAppearing()和OnDisappearing()同时被调用
首先,从你的代码逻辑来看,if-else分支应该只会实例化MainPage或MainPageTablet中的一个,理论上不应该出现两个页面的生命周期方法同时触发的情况。出现这个问题可能有以下几个原因:
Device.Idiom判断时机过早:在
App.xaml.cs的构造函数中执行判断时,部分平台(比如UWP)的Device.Idiom可能还未完成初始化,导致判断逻辑出现异常,意外实例化了两个页面。建议把页面选择逻辑移到OnStart()方法中执行,这个时机平台的设备信息已经完全就绪:protected override void OnStart() { Page startupPage = null; if (Device.Idiom == TargetIdiom.Phone) startupPage = new NavigationPage(new MainPage()); else startupPage = new NavigationPage(new MainPageTablet()); MainPage = startupPage; }代码中存在其他页面实例化逻辑:检查你的项目中是否有其他地方(比如某个页面的构造函数、ViewModel的初始化代码)不小心实例化了另一个页面,导致两个页面都被加载。
早期Xamarin.Forms版本的Bug:如果你使用的是较旧的Xamarin.Forms版本,可能存在
Device.Idiom判断不准确的Bug,尝试升级到稳定版本可以解决这类问题。
正常情况下,当你正确实例化单个页面并包裹在NavigationPage中时,只会触发该页面的OnAppearing()方法,不会出现两个页面同时执行生命周期方法的情况。
问题2:移除NavigationPage后,ToolbarItem消失
是的,ToolbarItem的显示确实依赖于NavigationPage的导航栏,这是Xamarin.Forms的设计逻辑:
ContentPage本身没有内置的工具栏容器,它定义的ToolbarItem需要依托NavigationPage顶部的导航栏来展示。- 当你直接把
ContentPage设为MainPage时,没有了NavigationPage提供的导航栏,ToolbarItem自然就没有地方显示,所以会消失。
解决方案:
如果你需要保留ToolbarItem,必须将页面包裹在NavigationPage中,这是唯一的官方解决方案。结合第一个问题的修复,只要确保只实例化单个页面并正确包裹,就能同时实现页面适配和工具栏显示的需求。
另外,如果你不想使用默认的NavigationPage导航栏样式,可以通过自定义渲染器来修改导航栏的外观,或者使用第三方控件库来实现自定义工具栏,但核心逻辑还是需要依托NavigationPage来承载ToolbarItem。
内容的提问来源于stack exchange,提问作者J.Martin

