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

C# 从控制台应用程序运行WPF应用程序时,将忽略app.xaml,c#,.net,wpf,xaml,C#,.net,Wpf,Xaml,假设我已经创建了一个WPF应用程序,让我们使用Visual Studio 2019中的默认模板将其称为TestApplication,也就是说,我使用App.xaml、App.xaml.cs、MainWindow.xaml和MainWindow.xaml.cs进行了设置 然后,我尝试通过以下方式从不同程序集中的控制台应用程序以编程方式运行此WPF应用程序: [STAThread] 静态void Main(字符串[]参数) { var app=newtestapplication.app(); a

假设我已经创建了一个WPF应用程序,让我们使用Visual Studio 2019中的默认模板将其称为
TestApplication
,也就是说,我使用
App.xaml
App.xaml.cs
MainWindow.xaml
MainWindow.xaml.cs
进行了设置

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

[STAThread]
静态void Main(字符串[]参数)
{
var app=newtestapplication.app();
app.Run();
}
现在,这本身就不太管用。提供了一种替代方法:如果我将
app.Run()
更改为
app.Run(newtestapplication.MainWindow())
,则实际上打开了
MainWindow

但是,这看起来应该是必要的:默认情况下,
App.xaml
在其
的定义中包括,将上述代码更改为

[STAThread]
静态void Main(字符串[]参数)
{
var app=newtestapplication.app();
app.InitializeComponent();
app.Run();
}
确实让我前进了一步,但我只剩下一个

System.IO.IOException:“找不到资源”mainwindow.xaml“


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

看起来,手动覆盖
应用程序就足够了。StartupUri
如下所示:

[STAThread]
静态void Main(字符串[]参数)
{
var app=newtestapplication.app();
app.InitializeComponent();
app.StartupUri=新Uri($”pack://application:,,,/TestApplication;组件/{app.StartupUri});
app.Run();
}

虽然它不是世界上最令人满意的解决方案,但它确实起到了作用,因为
App.xaml
中的所有其他相对路径都按照预期进行了转换;特别是,如果我在
App.xaml
中包含一个
ResourceDictionary
,其
源代码
,例如
Style.xaml
,那么控制台应用程序也会正确地选择它。