为WPF应用引入依赖注入时遇调试器外异常问题求助
问题解决方法
1. 窗口出现两次的原因及解决
WPF默认会通过App.xaml里的StartupUri="MainWindow.xaml"自动创建并显示主窗口,你在OnStartup里又手动调用window.Show(),等于启动了两次窗口。解决很简单:
- 打开App.xaml,删掉或者注释掉
StartupUri="MainWindow.xaml"这一行。
2. 空引用异常的解决
这跟两个包的兼容性没关系,是WPF默认启动机制搞的鬼。当你保留StartupUri时,WPF会尝试调用MainWindow的无参构造函数,但你只写了带参的,这时候就会触发空引用异常(本质是构造函数找不到导致的错误,只是调试器没加载符号所以显示为空引用)。
完整修正步骤:
第一步:修改App.xaml
移除自动启动配置:
<Application x:Class="你的应用名.App" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> <Application.Resources> </Application.Resources> </Application>
第二步:调整App.xaml.cs的代码顺序(可选但推荐)
把编码注册的代码放在最前面,避免后续操作碰到编码问题:
protected override void OnStartup(StartupEventArgs e) { Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); var services = new ServiceCollection(); services.AddSingleton<ViewModel.MainVM>(); services.AddScoped<MainWindow>(); var serviceProvider = services.BuildServiceProvider(); var window = serviceProvider.GetRequiredService<MainWindow>(); window.Show(); }
第三步:保留现有MainWindow构造函数
你的带参构造函数逻辑没问题,不用改:
public partial class MainWindow : Window { private readonly ViewModel.MainVM mainVM; public MainWindow(ViewModel.MainVM mainVM) { this.mainVM = mainVM; this.DataContext = mainVM; InitializeComponent(); } }
补充说明
- CommunityToolkit.Mvvm和Microsoft.DependencyInjection完全兼容,不存在兼容性问题,你的问题纯是WPF默认启动和手动DI启动的冲突导致的。
- 调试符号加载失败的话,可以试试清理解决方案后重新生成,或者在调试设置里开启“启用.NET框架源代码步进”(如果需要调试框架代码)。
内容的提问来源于stack exchange,提问作者UWorldGX
相关产品推荐
相关产品推荐

