gpt4 book ai didi

wpf - 如果我的应用程序未设置 StartupUri,则 App.xaml 文件不会被解析?

转载 作者:行者123 更新时间:2023-12-03 06:35:04 25 4
gpt4 key购买 nike

背景:我正在使用 MVVM 创建 WPF 应用程序,并使用 DI 容器构建我的 ViewModel

我的 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 ,并尝试创建 MainWindow通过 Hook OnStartup在 App.xaml.cs 中,如下所示:

protected override void OnStartup( StartupEventArgs e )
{
base.OnStartup(e);
new MainWindow().Show();
}

问题是,应用程序在尝试显示窗口时崩溃,但有以下异常(exception):

Cannot find resource named '{serviceLocator}'. Resource names are case sensitive. Error at object 'System.Windows.Data.Binding' in markup file 'WpfApp;component/mainwindow.xaml' Line 8 Position 45.

据我所知,<Application.Resources>部分根本没有从 xaml 文件中读取。我可以在 OnStartup 中放置一些代码,以编程方式添加资源,如下所示:

Resources.BeginInit();
Resources.Add("serviceLocator", new ServiceLocator());
Resources.EndInit();

然而,这是一个丑陋的黑客,如果我想稍后在 app.xaml 文件中添加其他内容,这对我没有帮助:-(

我应该 Hook 其他事件吗?有办法解决这个问题吗?

最佳答案

不要重写 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();
}
}

关于wpf - 如果我的应用程序未设置 StartupUri,则 App.xaml 文件不会被解析?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/543414/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com