【发布时间】:2009-02-12 21:37:15
【问题描述】:
背景:我正在使用 MVVM 创建 WPF 应用程序,并使用 DI 容器来构建我的 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”第 8 行位置 45 中的对象“System.Windows.Data.Binding”出错。
据我所知,<Application.Resources> 部分根本没有从 xaml 文件中读出。我可以在 OnStartup 中添加一些代码,像这样以编程方式添加资源:
Resources.BeginInit();
Resources.Add("serviceLocator", new ServiceLocator());
Resources.EndInit();
但是,这是一个丑陋的 hack,如果我以后想在 app.xaml 文件中添加其他内容,这对我没有帮助:-(
我应该挂钩其他事件吗?有没有办法解决这个问题?
【问题讨论】:
标签: wpf xaml resources startup