c# - 从控制台应用程序运行 WPF 应用程序时,忽略 App.xaml

标签 c# .net wpf 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();
}

现在,这不会对自己完全起作用。 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/

相关文章:

c# - 如何在特定时间启动 BackgroundWorker?

c# - 我应该把我的代码放在 Singleton 中的什么地方?

c# - 从 ViewModel 打开一个窗口

wpf - 我应该使用 DataTemplates 还是 UserControl 来显示扩展类的不同控件?

c# - 如何从 .cs 文件更改 WPF 菜单项中的文本?

c# - Asp.net gridview,在编辑模式下在代码后面获取绑定(bind)字段值

c# - asp.net core 中的队列任务

c# - 以多行而不是一长行显示 JSON 文件的内容

.net - 是什么导致错误 "Collection was modified after the enumerator was instantiated"?

c# - 如果我处置我的 ObjectContext,我的实体是否分离?