Xamarin构建Master Detail Page触发“Exception has been thrown by the target of an invocation”错误
我看你登录后进入Home这个MasterDetailPage时,弹出了这个反射调用的异常,但界面还停在Home页。这类错误大多是XAML/代码里有未正确初始化的元素、导航逻辑不对,或者资源引用出问题导致的。结合你贴的代码,我整理了几个排查和修复方向:
1. 先检查图片资源有没有加对
你的XAML里用了background.jpg,如果这个图片没正确放到各个平台的资源文件夹里(比如Android的Drawable、iOS的Resources),或者文件名大小写不对(Android是区分大小写的),加载页面时就会炸锅。
- 确认
background.jpg已经加到对应平台的资源目录,并且设置了正确的生成操作:Android设成AndroidResource,iOS设成BundleResource。 - 核对文件名拼写,别出现大小写不匹配的情况。
2. 修正Logout按钮的导航逻辑
你现在Logout用的是await Navigation.PushModalAsync(new Login_Page());,但Home是MasterDetailPage,它的导航栈和普通ContentPage不一样,直接PushModal容易出导航上下文的问题。建议改成下面两种方式之一:
如果登录页是通过PushModalAsync打开Home的,那直接弹出当前页面回到登录页:
private async void Handle_Clicked_1(object sender, System.EventArgs e) { await Navigation.PopModalAsync(); }
如果登录后是把Home设成了主页面,那直接替换主页面:
private void Handle_Clicked_1(object sender, System.EventArgs e) { App.Current.MainPage = new Login_Page(); }
3. 检查Create_Activity页面本身有没有问题
点击“Create Activity”时你直接把Detail设成了new Create_Activity(),如果这个页面自己初始化就有问题(比如XAML里有未定义的控件、绑定错误),也会触发这个异常。
- 单独跑一下Create_Activity页面,确认它能正常打开、显示。
- 检查它的XAML和代码有没有语法错误,或者引用了不存在的资源。
4. 抓一下具体的异常细节
这个泛泛的反射异常背后肯定有更具体的内部错误,你可以在Home的构造函数里加个try-catch,或者在App.xaml.cs里加全局异常捕获,就能看到到底哪里错了:
public Home() { try { InitializeComponent(); } catch (Exception ex) { // 输出详细错误信息到调试窗口 System.Diagnostics.Debug.WriteLine($"初始化出错: {ex.Message}"); if (ex.InnerException != null) { System.Diagnostics.Debug.WriteLine($"内部错误原因: {ex.InnerException.Message}"); } } }
这样你就能在调试输出里看到具体的错误,不用对着泛泛的反射异常头疼了。
5. 确认MasterDetailPage的导航结构是否正确
MasterDetailPage一般都是作为应用的主页面来用的,登录成功后应该这样设置:
App.Current.MainPage = new Home();
别用PushAsync或者PushModalAsync来打开它,不然导航栈会乱掉,也容易出异常。
内容的提问来源于stack exchange,提问作者Mohamed Al Sabbagh

