假设我使用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();
}
现在,仅凭这个代码是无法正常工作的。这个答案的第一部分提供了一种替代方法:如果我将
app.Run()
更改为app.Run(new TestApplication.MainWindow())
,那么实际上打开的是MainWindow
。
然而,这看起来应该是必要的:默认情况下,App.xaml
在其定义<Application />
中包括了StartupUri="MainWindow.xaml"
,这表明它应该可以自行找到MainWindow
。
更普遍的情况是,通过这种方法完全忽略了App.xaml
;在我的设置中,我已经在App.xaml
中包含了一个ResourceDictionary
集合,但它们根本不会被加载。
所以,有没有一种以编程方式运行WPF应用程序并考虑XAML内容的方法呢?
编辑:在尝试一番后,我意识到InitializeComponent
负责处理窗口和用户控件的这一点。如这个答案所建议的,将上面的代码更改为
[STAThread]
static void Main(string[] args)
{
var app = new TestApplication.App();
app.InitializeComponent();
app.Run();
}
确实使我更进一步,但是我却遇到了一个
System.IO.IOException: '找不到资源'mainwindow.xaml'.'
我想这可能是因为相对路径在不同的程序集中无法正确解析,但它并没有提供太多关于如何解决问题的提示。