C# 从控制台应用程序运行WPF应用程序时,将忽略app.xaml
假设我已经创建了一个WPF应用程序,让我们使用Visual Studio 2019中的默认模板将其称为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
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
,那么控制台应用程序也会正确地选择它。