【问题标题】:When running WPF app from console app, App.xaml is ignored从控制台应用程序运行 WPF 应用程序时,App.xaml 被忽略
【发布时间】:2019-05-13 17:05:21
【问题描述】:

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

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

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

现在,这不会完全靠自己。 first part of this answer 提供了一种替代方法:如果我将app.Run() 更改为app.Run(new TestApplication.MainWindow()),那么MainWindow 实际上是打开的。

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

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

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

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

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

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

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

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

【问题讨论】:

  • @EdPlunkett:我的意思是实际上打开了一个窗口。

标签: c# .net wpf xaml


【解决方案1】:

看起来手动覆盖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.xaml 中包含ResourceDictionarySource,例如Style.xaml,那么控制台应用程序也可以正确获取。

【讨论】:

    猜你喜欢
    • 2011-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多