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

WPF依赖注入场景下无法找到App.xaml静态资源的技术问询

解决IoC容器实例化WPF视图时无法访问App.xaml静态资源的问题

你的推测完全正确——当你通过IoC容器直接实例化MainWindow时,WPF并没有自动将应用程序的资源上下文关联到这个窗口实例,导致它找不到App.xaml中定义的静态资源。下面是几种可行的解决方案:

方案1:在App启动时手动关联资源字典

在OnStartup方法中,实例化窗口后,将App的资源字典合并到窗口的资源集合中:

protected override void OnStartup(StartupEventArgs e)
{
    this.container = new StandardKernel();
    this.MainWindow = container.Get<MainWindow>();
    
    // 将App的资源字典合并到MainWindow的资源中
    this.MainWindow.Resources.MergedDictionaries.Add(Application.Current.Resources);
    
    this.MainWindow.Show();
}

这个方法简单直接,在应用启动的入口处完成资源关联,不会让视图层产生额外耦合。

方案2:在视图构造函数中合并资源

如果你希望视图自身处理资源依赖,可以在MainWindow的构造函数中添加资源合并逻辑:

public MainWindow()
{
    InitializeComponent();
    // 合并App级别的资源字典
    Resources.MergedDictionaries.Add(App.Current.Resources);
}

不过这种方式会让视图直接依赖App类,耦合度稍高,更推荐方案1。

方案3:调整IoC注册逻辑(针对Ninject)

你也可以在Ninject的绑定配置中,指定窗口实例化后自动关联资源。比如创建一个自定义的绑定逻辑:

container.Bind<MainWindow>().ToMethod(ctx => 
{
    var window = new MainWindow();
    window.Resources.MergedDictionaries.Add(Application.Current.Resources);
    return window;
});

这样每次从容器获取MainWindow时,都会自动处理资源关联,保持OnStartup方法的简洁。

额外说明

要确保App.xaml中的资源定义没有拼写错误(资源名称大小写敏感),你的代码里ButtonStyle的定义和引用是匹配的,所以只要解决资源上下文关联问题就能修复异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:26:36