背景:我正在使用MVVM创建一个WPF应用程序,并使用依赖注入容器构建我的ViewModels
我的App.xaml看起来像这样:
<Application x:Class="WpfApp.App"
...xmlns etc...
StartupUri="MainWindow.xaml">
<Application.Resources>
<app:ServiceLocator x:Key="serviceLocator" />
</Application.Resources>
</Application>
MainWindow.xaml长这样:
<Window x:Class="CompositeMefWpfApp.MainWindow"
...xmlns etc... >
<Control.DataContext>
<Binding Path="MainWindowViewModel" Source="{StaticResource serviceLocator}" />
</Control.DataContext>
现在,所有东西都很好,但是StartupUri
硬编码到了XAML中,我不想这样做。
根据我找到的一些博客文章的指导,我删除了StartupUri
,并尝试通过在App.xaml.cs中连接OnStartup
来创建MainWindow
,就像这样:
protected override void OnStartup( StartupEventArgs e )
{
base.OnStartup(e);
new MainWindow().Show();
}
问题在于当尝试显示窗口时,应用程序会崩溃,并出现以下异常:
找不到名为“{serviceLocator}”的资源。资源名称区分大小写。 在标记文件“WpfApp;component/mainwindow.xaml”的对象“System.Windows.Data.Binding”处发生错误,第8行第45个位置。
据我所知,<Application.Resources>
部分根本没有从 xaml 文件中读取。 我可以在 OnStartup 中放一些代码来以编程方式添加资源,如下所示:
Resources.BeginInit();
Resources.Add("serviceLocator", new ServiceLocator());
Resources.EndInit();
然而,这是一个丑陋的hack,如果我想以后在app.xaml文件中放置其他东西,它对我没有帮助:-(
我应该挂钩其他事件吗?有什么解决方法吗?