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

Windows平台MAUI中PushAsync导致ContentPage的SizeChanged事件失效

MAUI Windows平台PushAsync导航后SizeChanged事件失效问题

问题场景

  • 所有页面基于继承自ContentPage的自定义类BaseControl,测试页TesterPage绑定了SizeChanged事件处理方法ContentPage_SizeChanged
  • 通过自定义NavigationService实现ViewModel导航:从LoginPage调用PushAsync导航到TesterPage后,SizeChanged仅在页面加载时触发一次,后续调整窗口大小不再触发
  • 直接将TesterPage设置为MainPage,或通过NavigateTo的else分支设置MainPage时,事件可正常响应
  • 仅Windows平台存在此问题,MacCatalyst运行正常;环境为Visual Studio 17.3.2,net6.0-Windows10.0.19041.0

可行解决方案

1. 改用窗口SizeChanged事件替代页面事件

由于PushAsync导航后页面的SizeChanged事件未正确关联窗口变化,可在页面生命周期中手动订阅/取消订阅窗口的SizeChanged事件:

protected override void OnAppearing()
{
    base.OnAppearing();
    if (Application.Current.Windows.FirstOrDefault() is Window currentWindow)
    {
        currentWindow.SizeChanged += Window_SizeChanged;
    }
}

protected override void OnDisappearing()
{
    base.OnDisappearing();
    if (Application.Current.Windows.FirstOrDefault() is Window currentWindow)
    {
        currentWindow.SizeChanged -= Window_SizeChanged;
    }
}

private void Window_SizeChanged(object sender, EventArgs e)
{
    // 复用原页面SizeChanged事件的处理逻辑
    ContentPage_SizeChanged(this, EventArgs.Empty);
}

2. 检查自定义NavigationService的PushAsync实现

确保导航服务中PushAsync是通过MAUI原生导航栈调用,避免手动操作页面容器导致事件丢失:

// 正确的PushAsync实现示例
public async Task PushAsync<TViewModel>(bool animated = true) where TViewModel : BaseViewModel
{
    var targetPage = _pageResolver.ResolvePageForViewModel<TViewModel>();
    await Application.Current.MainPage.Navigation.PushAsync(targetPage, animated);
}

3. 升级MAUI及Visual Studio版本

该问题属于.NET 6 MAUI Windows平台的已知bug,升级至.NET 7+(对应Visual Studio 17.4及以上版本)可修复此导航事件绑定异常。

内容的提问来源于stack exchange,提问作者John Mc

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 21:57:32