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
相关产品推荐
相关产品推荐

