如果我的应用程序没有设置StartupUri,App.xaml文件不会被parsing?

背景:我正在使用MVVM创build一个WPF应用程序,并使用一个DI容器来构build我的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和文章的指导,我删除了StartupUri ,并尝试通过在App.xaml.cs中挂载OnStartup来创buildMainWindow ,如下所示:

 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(); 

然而,这是一个丑陋的黑客,如果我想稍后在app.xaml文件中放入其他东西,它也不会帮助我:-(

我应该挂钩一些其他事件? 有没有解决的办法?

而不是重写OnStartup,而是尝试使用事件:

 <Application x:Class="My.App" xmlns="..." Startup="Application_Startup" ShutdownMode="OnExplicitShutdown"> <Application.Resources> <app:ServiceLocator x:Key="serviceLocator" /> </Application.Resources> </Application> 

代码后面:

 public partial class App : Application { public App() { } private void Application_Startup(object sender, StartupEventArgs e) { // TODO: Parse commandline arguments and other startup work new MainWindow().Show(); } } 

最简单的解决方法是定义一个x:Name

 <Application x:Name="App" ... <Application.Resources> ... </Application.Resources> </Application> 

更多信息: http : //connect.microsoft.com/VisualStudio/feedback/details/472729/wpf-cannot-find-resource-defined-in-the-app-xaml-file

我遇到了类似的问题。 有一个VS代码生成错误,当<Application.Resources>只包含一个条目并且没有StartupUri属性时,连接<Application.Resources>到程序其余部分所需的代码有时不会被插入。

详细信息: http : //bengribaudo.com/blog/2010/08/19/106/bug-single-application-resources-entry-ignored (免责声明 – 链接指向我的博客)

为了解决这个知道的bug,你也可以通过编程来添加资源。

 var rd = new ResourceDictionary() rd.Source = new Uri("pack://application:,,,/Resources;component/Colors.xaml"); Resources.MergedDictionaries.Add(rd); 

这个代码可以放在App类的construtor里面。