假设我创建了一个 WPF 应用程序,我们将其命名为 TestApplication
,使用 Visual Studio 2019 中的默认模板,即我设置了 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"
,这表明它应该能够以某种方式找到 MainWindow
靠自己。
更一般地说,App.xaml
通过这种方法似乎完全被忽略了;在我的设置中,我包含了一个 ResourceDictionary
的集合在App.xaml
,它们根本不会被加载。
那么,是否有某种方法可以以编程方式运行考虑到 XAML 内容的 WPF 应用程序?
编辑:玩了一会儿之后,我意识到 InitializeComponent
负责为窗口和用户控件处理此问题。正如 this answer 所建议的那样, 把上面的代码改成
[STAThread]
static void Main(string[] args)
{
var app = new TestApplication.App();
app.InitializeComponent();
app.Run();
}
确实让我更进了一步,但我还剩下一个
System.IO.IOException: 'Cannot locate resource 'mainwindow.xaml'.'
我可以想象发生这种情况是因为相对路径在不同的程序集中无法正确解析,但它并没有提供太多关于如何解决问题的提示。
最佳答案
看起来手动覆盖 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
,比如 Style.xaml
,然后控制台应用程序也会正确地拾取它。
关于c# - 从控制台应用程序运行 WPF 应用程序时,忽略 App.xaml,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56116896/