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

.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导航过渡动画

若不想完全禁用动画,可替换默认过渡为滑动动画,避免白屏:

  1. 在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"/>
  1. 创建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"/>
  1. 返回时指定自定义动画:
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 18:57:32