从控制台应用程序运行WPF应用程序时,将忽略App.xaml

时间:2019-05-13 17:05:21

标签: c# .net wpf xaml

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

然后我试图通过不同程序集中的控制台应用程序以编程方式运行此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",这表明它应该能够以某种方式找到{ {1}}。

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

那么,有没有什么方法可以通过编程方式运行WPF应用程序,从而将XAML的内容考虑在内?

编辑:玩了一段时间后,我意识到App.xaml负责处理Windows和用户控件。 this answer也建议将上述代码更改为

InitializeComponent

的确确实使我迈出了一步,但随后我留下了一个

  

System.IO.IOException :“无法找到资源'mainwindow.xaml'。”

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

1 个答案:

答案 0 :(得分: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的{​​{1}},那么控制台应用程序也会正确地选择它。