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
相关产品推荐
相关产品推荐

