.NET MAUI使用Prism导航返回Android页面时出现白屏问题求助
Android返回白屏闪显解决方案
针对Prism.DryIoc.Maui 9.0.401-pre在Android设备上返回时的白屏问题,可尝试以下几种方案:
1. 禁用导航过渡动画
Prism默认的淡入淡出过渡在Android上可能触发白屏,可在返回时显式禁用动画:
// 单个返回操作禁用动画 await NavigationService.GoBackAsync(new NavigationParameters { { nameof(INavigationParameters.UseAnimations), false } });
如果需要全局禁用,可在MauiProgram.cs的RegisterTypes中配置:
containerRegistry.RegisterInstance<INavigationOptions>(new NavigationOptions { UseAnimations = false });
2. 统一窗口与页面背景色
Android系统在页面切换时会显示窗口背景,若窗口背景与页面背景色不一致,会出现短暂白屏。修改Android项目的Resources/values/styles.xml:
<style name="AppTheme" parent="Theme.MaterialComponents.Light.NoActionBar"> <item name="android:windowBackground">@color/app_background</item> </style>
在Colors.xaml中定义对应颜色,并确保所有页面的Background属性使用该颜色:
<Color x:Key="AppBackground">#F5F5F5</Color>
3. 自定义Android导航过渡动画
若不想完全禁用动画,可替换默认过渡为滑动动画,避免白屏:
- 在Android项目的
Resources/anim目录下创建slide_in_left.xml:
<?xml version="1.0" encoding="utf-8"?> <translate xmlns:android="http://schemas.android.com/apk/res/android" android:fromXDelta="-100%p" android:toXDelta="0" android:duration="300"/>
- 创建
slide_out_right.xml:
<?xml version="1.0" encoding="utf-8"?> <translate xmlns:android="http://schemas.android.com/apk/res/android" android:fromXDelta="0" android:toXDelta="100%p" android:duration="300"/>
- 返回时指定自定义动画:
var parameters = new NavigationParameters(); parameters.Add(NavigationParameterKeys.Animation, new NavigationAnimation { AndroidEnterAnimation = Resource.Animation.slide_in_left, AndroidExitAnimation = Resource.Animation.slide_out_right }); await NavigationService.GoBackAsync(parameters);
4. 优化页面初始化逻辑
检查上一页的OnNavigatedTo方法,避免在该方法中执行耗时同步操作,尽量使用异步加载,防止UI线程阻塞导致白屏。
完整.NET MAUI Prism导航示例
以下是基于Prism.DryIoc.Maui 9.0.401-pre的完整导航实现:
1. 项目配置
创建.NET MAUI项目后,安装NuGet包Prism.DryIoc.Maui(版本9.0.401-pre)。
2. MauiProgram.cs
using Prism.DryIoc.Maui; using Prism.Ioc; using YourApp.Views; using YourApp.ViewModels; namespace YourApp; public static class MauiProgram { public static MauiApp CreateMauiApp() { var builder = MauiApp.CreateBuilder(); builder.UsePrismApp<App>(prism => { prism.RegisterTypes(containerRegistry => { // 注册视图与视图模型关联 containerRegistry.RegisterForNavigation<MainPage, MainViewModel>(); containerRegistry.RegisterForNavigation<DetailPage, DetailViewModel>(); }); // 设置初始导航页面 prism.OnAppStart(async navigationService => { await navigationService.NavigateAsync("MainPage"); }); }); return builder.Build(); } }
3. App.xaml.cs
using Prism.Maui; namespace YourApp; public partial class App : PrismApplication { public App(IPlatformInitializer initializer) : base(initializer) { InitializeComponent(); } }
4. 基础视图模型类ViewModelBase.cs
using Prism.Mvvm; using Prism.Navigation; namespace YourApp.ViewModels; public class ViewModelBase : BindableBase, INavigationAware, IDestructible { protected INavigationService NavigationService { get; } private string _title; public string Title { get => _title; set => SetProperty(ref _title, value); } public ViewModelBase(INavigationService navigationService) { NavigationService = navigationService; } public virtual void OnNavigatedFrom(INavigationParameters parameters) { } public virtual void OnNavigatedTo(INavigationParameters parameters) { } public virtual void OnNavigatingTo(INavigationParameters parameters) { } public virtual void Destroy() { } }
5. 主页实现
MainPage.xaml
<?xml version="1.0" encoding="utf-8" ?> <ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" x:Class="YourApp.Views.MainPage" Title="主页"> <VerticalStackLayout Padding="24" Spacing="16"> <Label Text="Prism导航示例主页" FontSize="Large" HorizontalOptions="Center"/> <Button Text="跳转到详情页" Command="{Binding NavigateToDetailCommand}" /> </VerticalStackLayout> </ContentPage>
MainViewModel.cs
using Prism.Commands; using Prism.Navigation; namespace YourApp.ViewModels; public class MainViewModel : ViewModelBase { public DelegateCommand NavigateToDetailCommand { get; } public MainViewModel(INavigationService navigationService) : base(navigationService) { NavigateToDetailCommand = new DelegateCommand(async () => await NavigateToDetail()); Title = "主页"; } private async Task NavigateToDetail() { // 传递参数到详情页 var parameters = new NavigationParameters(); parameters.Add("WelcomeMessage", "欢迎进入详情页!"); await NavigationService.NavigateAsync("DetailPage", parameters); } }
6. 详情页实现
DetailPage.xaml
<?xml version="1.0" encoding="utf-8" ?> <ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" x:Class="YourApp.Views.DetailPage" Title="详情页"> <VerticalStackLayout Padding="24" Spacing="16"> <Label Text="{Binding WelcomeMessage}" FontSize="Large" HorizontalOptions="Center"/> <Button Text="返回主页" Command="{Binding GoBackCommand}" /> </VerticalStackLayout> </ContentPage>
DetailViewModel.cs
using Prism.Commands; using Prism.Navigation; namespace YourApp.ViewModels; public class DetailViewModel : ViewModelBase { private string _welcomeMessage; public string WelcomeMessage { get => _welcomeMessage; set => SetProperty(ref _welcomeMessage, value); } public DelegateCommand GoBackCommand { get; } public DetailViewModel(INavigationService navigationService) : base(navigationService) { GoBackCommand = new DelegateCommand(async () => await GoBack()); Title = "详情页"; } public override void OnNavigatedTo(INavigationParameters parameters) { base.OnNavigatedTo(parameters); // 接收传递的参数 if (parameters.TryGetValue("WelcomeMessage", out string message)) { WelcomeMessage = message; } } private async Task GoBack() { // 禁用动画解决Android白屏问题 var parameters = new NavigationParameters(); parameters.Add(nameof(INavigationParameters.UseAnimations), false); await NavigationService.GoBackAsync(parameters); } }
内容的提问来源于stack exchange,提问作者Achoo
相关产品推荐
相关产品推荐

