假设我已经使用Visual Studio 2019中的默认模板创建了一个WPF应用程序,我们将其称为TestApplication
,即我已经设置为App.xaml
,App.xaml.cs
, MainWindow.xaml
和MainWindow.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'。”
我可以想象发生这种情况,是因为在不同的程序集中时相对路径无法正确解析,但是它并不能为如何解决问题提供很多提示。
答案 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
中包含一个ResourceDictionary
为Source
的{{1}},那么控制台应用程序也会正确地选择它。>