如果我的应用程序没有设置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里面。