You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 02:42:42