【发布时间】:2019-05-13 17:05:21
【问题描述】:
假设我创建了一个 WPF 应用程序,我们称之为 TestApplication,使用 Visual Studio 2019 中的默认模板,即我设置了 App.xaml、App.xaml.cs、MainWindow.xaml 和 @ 987654327@.
然后我尝试从不同程序集中的控制台应用程序以编程方式运行此 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",这表明它应该能够以某种方式自行找到MainWindow。
更一般地说,App.xaml 似乎通过这种方法完全被忽略了;在我的设置中,我在App.xaml 中包含了ResourceDictionary 的集合,它们根本不会被加载。
那么,是否有某种方法可以以编程方式运行 WPF 应用程序并考虑 XAML 的内容?
编辑:玩了一会儿后,我意识到InitializeComponent 负责为窗口和用户控件处理这个问题。正如this answer 所建议的那样,将上面的代码更改为
[STAThread]
static void Main(string[] args)
{
var app = new TestApplication.App();
app.InitializeComponent();
app.Run();
}
确实让我更进一步,但我只剩下一个
System.IO.IOException:'找不到资源'mainwindow.xaml'。'
我可以想象会发生这种情况,因为相对路径在不同的程序集中无法正确解析,但它并没有提供太多关于如何解决问题的提示。
【问题讨论】:
-
@EdPlunkett:我的意思是实际上打开了一个窗口。