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

.NET MAUI依赖注入后无法访问App.xaml资源问题

.NET MAUI依赖注入配置后App.xaml资源运行时失效问题

我开发的应用采用MVVM模式并使用Community Toolkit特性,尝试通过依赖注入在ViewModel中使用带接口的ApiService。配置DI后,运行时无法访问App.xaml中的资源(尤其是颜色资源)——编写XAML时智能提示正常,但运行时失效。在使用依赖注入、修改ViewModel与View的关联方式前,资源使用完全正常,但无法使用ApiService。


相关代码

App.xaml.cs(Login页为初始页面)

public App(LoginPage page)
{
    InitializeComponent();
    MainPage = page;
}

LoginPage.xaml.cs

public partial class LoginPage : ContentPage
{
  public LoginPage(LoginPageViewModel loginPageViewModel)
  {
    BindingContext = loginPageViewModel;
    InitializeComponent();
  }
}

LoginPageViewModel

public LoginPageViewModel(IApiService apiService)
{
    _apiService = apiService;
    Opacity = 1f;
    IsEnabled = true;
    IsRunning = false;
}

LoginPage.xaml

<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
         xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
         x:Class="NewScholarApp.Views.LoginPage"
         Title="LoginPage"
         xmlns:vm="clr-namespace:NewScholarApp.ViewModels"
         x:DataType="vm:LoginPageViewModel"
         BackgroundColor="{StaticResource GreenSchool}">

MauiProgram.cs

public static MauiApp CreateMauiApp()
{
    var builder = MauiApp.CreateBuilder();
    builder
        .UseMauiApp<App>().UseMauiCommunityToolkit().ConfigureViewModels().ConfigureServices().ConfigureViews()
        .ConfigureFonts(fonts =>
        {
            fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular");
            fonts.AddFont("OpenSans-Semibold.ttf", "OpenSansSemibold");
        });

    //builder.Services.AddSingleton<ApiService>();

    return builder.Build();
}

视图与ViewModel注册扩展方法

public static MauiAppBuilder ConfigureViews(this MauiAppBuilder mauiAppBuilder)
{
    mauiAppBuilder.Services.AddTransient<LoginPage>();

    return mauiAppBuilder;
}

public static class RegisterViewModels
{
    public static MauiAppBuilder ConfigureViewModels(this MauiAppBuilder mauiAppBuilder)
    {
        mauiAppBuilder.Services.AddSingleton<LoginPageViewModel>();

        return mauiAppBuilder;
    }
}

问题原因与解决方案

该问题源于.NET MAUI中通过DI注入初始化App和页面时,App.xaml的资源字典可能在页面初始化前未完全加载,导致页面无法解析静态资源。

修复步骤:

  1. 调整页面初始化顺序
    在LoginPage.xaml.cs中,先调用InitializeComponent()加载页面及资源引用,再设置BindingContext:

    public partial class LoginPage : ContentPage
    {
      public LoginPage(LoginPageViewModel loginPageViewModel)
      {
        InitializeComponent();
        BindingContext = loginPageViewModel;
      }
    }
    
  2. 正确注册ApiService
    在MauiProgram.cs中补充接口与实现类的DI映射,确保IApiService能被正确解析:

    builder.Services.AddSingleton<IApiService, ApiService>();
    
  3. 备选方案:切换为DynamicResource
    如果上述调整无效,可暂时将StaticResource替换为DynamicResource,让资源在加载完成后动态更新:

    BackgroundColor="{DynamicResource GreenSchool}"
    

内容的提问来源于stack exchange,提问作者Luis Guzman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 19:45:38