首页 > 解决方案 > 从控制台应用程序运行 WPF 应用程序时,App.xaml 被忽略

问题描述

假设我创建了一个 WPF 应用程序,我们称之为TestApplication,使用 Visual Studio 2019 中的默认模板,即我设置了App.xamlApp.xaml.csMainWindow.xamlMainWindow.xaml.cs.

然后,我尝试通过不同程序集中的控制台应用程序以编程方式运行此 WPF 应用程序

[STAThread]
static void Main(string[] args)
{
    var app = new TestApplication.App();
    app.Run();
}

现在,这对自己不起作用。该答案的第一部分提供了一种替代方法:如果我更改app.Run()app.Run(new TestApplication.MainWindow()), thenMainWindow实际上是打开的。

但是,这看起来应该是必要的:默认情况下,App.xaml在其定义中包含<Application />a StartupUri="MainWindow.xaml",这表明它应该能够以某种方式自行查找MainWindow

更一般地说,App.xaml似乎通过这种方法完全忽略了;在我的设置中,我包含了ResourceDictionaryin的集合App.xaml,它们根本不会被加载。

那么,是否有某种方法可以以编程方式运行 WPF 应用程序并考虑 XAML 的内容?

编辑:玩了一会儿之后,我意识到InitializeComponent负责处理这个窗口和用户控件。正如这个答案所建议的那样,将上面的代码更改为

[STAThread]
static void Main(string[] args)
{
    var app = new TestApplication.App();
    app.InitializeComponent();
    app.Run();
}

确实让我更进一步,但我只剩下一个

System.IO.IOException:'找不到资源'mainwindow.xaml'。'

我可以想象会发生这种情况,因为在不同的程序集中时相对路径无法正确解析,但它并没有提供太多关于如何解决问题的提示。

标签: c#.netwpfxaml

解决方案


看起来手动覆盖就足够了Application.StartupUri,如下所示:

[STAThread]
static void Main(string[] args)
{
    var app = new TestApplication.App();
    app.InitializeComponent();
    app.StartupUri = new Uri($"pack://application:,,,/TestApplication;component/{app.StartupUri}");
    app.Run();
}

虽然不是世界上最令人满意的解决方案,但它似乎确实可以完成工作,因为所有其他相对路径App.xaml都按预期转换;特别是,如果我在App.xamlaResourceDictionary中包含 a Sourceof ,例如 ,Style.xaml那么控制台应用程序也会正确获取它。


推荐阅读