c# - 从控制台应用程序运行 WPF 应用程序时,App.xaml 被忽略
问题描述
假设我创建了一个 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();
}
现在,这对自己不起作用。该答案的第一部分提供了一种替代方法:如果我更改app.Run()
为app.Run(new TestApplication.MainWindow())
, thenMainWindow
实际上是打开的。
但是,这看起来应该是必要的:默认情况下,App.xaml
在其定义中包含<Application />
a StartupUri="MainWindow.xaml"
,这表明它应该能够以某种方式自行查找MainWindow
。
更一般地说,App.xaml
似乎通过这种方法完全忽略了;在我的设置中,我包含了ResourceDictionary
in的集合App.xaml
,它们根本不会被加载。
那么,是否有某种方法可以以编程方式运行 WPF 应用程序并考虑 XAML 的内容?
编辑:玩了一会儿之后,我意识到InitializeComponent
负责处理这个窗口和用户控件。正如这个答案所建议的那样,将上面的代码更改为
[STAThread]
static void Main(string[] args)
{
var app = new TestApplication.App();
app.InitializeComponent();
app.Run();
}
确实让我更进一步,但我只剩下一个
System.IO.IOException:'找不到资源'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
aResourceDictionary
中包含 a Source
of ,例如 ,Style.xaml
那么控制台应用程序也会正确获取它。
推荐阅读
- python - Google Sheets API 图像公式
- android - 如何在 android studio 中使用环境变量?
- python - Pandas groupby 从父数据框继承组?
- rust - 如何拥有一个接受来自另一个变量的闭包调用方法的结构?
- linux - 执行 curl 调用后如果不同则替换文件
- clojure - 对 java 对象使用类似解构的语法
- python - 如何使用 numpy where 打印匹配条件的第一个元素或将其转换为整数?
- python - 包含属性的 python 类的 ruamel.yaml 转储似乎会产生意外的 yaml 格式
- postgresql - 如何模拟缓慢的 postgres db
- python - VS Code 在 Python 代码执行期间不会打印,只会在最后打印