为何Navigation.PushModalSync命令报错‘Navigation’不包含‘PushModalAsync’的定义?是否缺少依赖?
首先得先澄清一个关键细节:Xamarin.Forms里根本不存在PushModalSync这个方法,你一开始写的方法名就是错误的,正确的模态导航异步方法是PushModalAsync。而你后来遇到的Navigation没有该方法的报错,主要是下面几个原因导致的:
1. 命名空间冲突搞混了Navigation对象
你引入了Android.Content.Res这个Android平台专属的命名空间,它里面的类型和Xamarin.Forms页面自带的Navigation属性产生了命名冲突——现在你的代码里的Navigation指向的是Android平台的某个对象,而非Xamarin.Forms的导航对象,自然没有PushModalAsync方法。
解决办法:
- 如果你的页面是写在跨平台共享项目(NetStandard/PCL)里的,直接删掉
Android.Content.Res这个命名空间引用,共享代码完全不需要引入平台特定的命名空间,这属于画蛇添足。 - 如果必须保留这个命名空间,就用完全限定名明确指定调用Xamarin.Forms的导航:
await Xamarin.Forms.Navigation.PushModalAsync(detailPage);
2. 页面基类不正确
要确保你的当前页面是继承自Xamarin.Forms.ContentPage(或其他Xamarin.Forms页面类,比如TabbedPage、CarouselPage),而不是Android平台的页面类。正确的页面类定义应该是这样的:
using Xamarin.Forms; namespace Abuse_Alert.Views { public class YourCurrentPage : ContentPage // 必须是Xamarin.Forms的页面类 { // 你的页面逻辑代码 } }
如果基类不对,Navigation属性就不是Xamarin.Forms的导航对象,自然找不到对应的方法。
3. 当前页面未处于有效导航上下文
如果你的当前页面是直接被设为Application.Current.MainPage,且没有包裹在NavigationPage里,那Navigation属性可能无法正常工作。这种情况下可以改用全局导航方式:
await Application.Current.MainPage.Navigation.PushModalAsync(detailPage);
或者在App启动时就把主页面包裹进NavigationPage:
// 在App.xaml.cs中 MainPage = new NavigationPage(new YourRootPage());
最后再提一句:你用NavigationPage包裹AudioRecorder来创建模态页面的写法是没问题的,这样能保留页面的导航栏。
内容的提问来源于stack exchange,提问作者Md Idiake

