.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的资源字典可能在页面初始化前未完全加载,导致页面无法解析静态资源。
修复步骤:
调整页面初始化顺序
在LoginPage.xaml.cs中,先调用InitializeComponent()加载页面及资源引用,再设置BindingContext:public partial class LoginPage : ContentPage { public LoginPage(LoginPageViewModel loginPageViewModel) { InitializeComponent(); BindingContext = loginPageViewModel; } }正确注册ApiService
在MauiProgram.cs中补充接口与实现类的DI映射,确保IApiService能被正确解析:builder.Services.AddSingleton<IApiService, ApiService>();备选方案:切换为DynamicResource
如果上述调整无效,可暂时将StaticResource替换为DynamicResource,让资源在加载完成后动态更新:BackgroundColor="{DynamicResource GreenSchool}"
内容的提问来源于stack exchange,提问作者Luis Guzman
相关产品推荐
相关产品推荐

