.NET MAUI中DisplayInfoChanged事件仅随机触发的问题排查
.NET MAUI MainDisplayInfoChanged事件随机无响应的解决方法
以下是你可能遗漏的几个关键环节:
1. 事件订阅未跟随页面生命周期管理
在页面构造函数中订阅事件,当屏幕旋转时,部分平台(如Android)会重建页面实例,原页面实例的订阅会失效,而新实例如果没重新订阅,就会导致事件不触发。正确的做法是在页面的OnAppearing中订阅,OnDisappearing中取消订阅:
public partial class MainPage : ContentPage { public MainPage(CircleColorsViewModel viewModel) { InitializeComponent(); BindingContext = viewModel; } protected override void OnAppearing() { base.OnAppearing(); DeviceDisplay.Current.MainDisplayInfoChanged += OnMainDisplayInfoChanged; } protected override void OnDisappearing() { base.OnDisappearing(); DeviceDisplay.Current.MainDisplayInfoChanged -= OnMainDisplayInfoChanged; } private void OnMainDisplayInfoChanged(object sender, DisplayInfoChangedEventArgs e) { // 后续弹窗逻辑 } }
2. 未处理UI线程切换
MainDisplayInfoChanged事件可能在后台线程触发,直接调用DisplayAlert会因不在UI线程而无响应,需要强制切换到UI线程执行弹窗:
private void OnMainDisplayInfoChanged(object sender, DisplayInfoChangedEventArgs e) { MainThread.BeginInvokeOnMainThread(() => { DisplayAlert("屏幕方向", $"当前方向:{e.DisplayInfo.Orientation}", "确定"); }); }
3. Android平台缺失配置导致页面重建
Android默认在屏幕旋转时会销毁并重建Activity,导致页面实例更换,原订阅失效。需要在Platforms/Android/AndroidManifest.xml的<activity>标签中添加配置,禁止系统因旋转重建Activity:
<activity android:name=".MainActivity" android:configChanges="orientation|screenSize|smallestScreenSize" ...> </activity>
4. 事件取消订阅不彻底
如果页面多次创建,未正确取消旧实例的订阅,可能导致事件触发混乱。确保每次OnDisappearing时都取消订阅,避免内存泄漏和触发异常。
内容的提问来源于stack exchange,提问作者Nevin Sever
相关产品推荐
相关产品推荐

