Xamarin.Forms OnLaunched不触发、LaunchActivatedEventArgs报错排查
根本原因
你参考的文档是UWP/Windows App SDK原生开发的文档,和Xamarin.Forms跨平台开发的生命周期模型完全不匹配:
LaunchActivatedEventArgs、OnLaunched启动生命周期方法是UWP原生项目的专属API,不属于Xamarin.Forms共享层的Application类。Xamarin.Forms的Application类只开放了OnStart、OnSleep、OnResume三个可重写的生命周期方法,根本不存在匹配OnLaunched(LaunchActivatedEventArgs e)签名的可重写方法。- 你手动在共享项目的App类里加的
OnLaunched方法是完全自定义的普通方法,Xamarin.Forms框架启动流程里根本没有调用这个方法的逻辑,自然断点永远不会命中。 - 你引入的
Windows.ApplicationModel.Activation是UWP专属命名空间,直接写在共享项目里后续适配Android、iOS时会直接编译失败,这两个平台不存在这个命名空间下的类型。
修复方案
如果你的目标是做跨UWP、Android、iOS三端通用的C#代码式样式初始化,完全不需要用平台专属的启动方法,直接把初始化逻辑放在共享项目App类的构造函数中执行即可:
- 删除手动添加的无效
OnLaunched方法,移除共享项目中对Windows.ApplicationModel.Activation的引用,避免跨平台编译错误。 - 将样式初始化代码放到App构造函数中,放在
InitializeComponent()调用之后、设置MainPage之前即可,修改后的代码如下:
using System; using Xamarin.Forms; using Xamarin.Forms.Xaml; using FieldDataTemplateSelectorSample.AppStyles; namespace FieldDataTemplateSelectorSample { public partial class App : Application { public App() { InitializeComponent(); // 全局样式初始化,三端启动时都会执行 Resources = InitStyles.GetAppStyles(); MainPage = new MainPage(); } protected override void OnStart() { } protected override void OnSleep() { } protected override void OnResume() { } } }
如果后续需要写UWP平台专属的启动逻辑,不要写在共享项目中,直接找到UWP平台项目目录下的原生
App.xaml.cs,在那个类里重写UWP原生的OnLaunched方法即可,该方法才会被UWP框架在应用启动时自动调用。
内容的提问来源于stack exchange,提问作者Lution
相关产品推荐
相关产品推荐

