【问题标题】:What is the entry point of a WPF application?WPF 应用程序的入口点是什么?
【发布时间】:2014-08-18 20:45:36
【问题描述】:

Main 方法是 C# 控制台应用程序的入口点。因此,例如,如果我必须启动一些线程或服务,我将在 Main 方法中完成。

我在 WPF 项目中没有看到 Main 方法,那么 WPF 应用程序的入口点是什么?如果我必须启动一些线程或服务,应该在哪里编写启动它们的代码?

更新:this answer 总结了可用的解决方案,但每种解决方案的优缺点是什么?

【问题讨论】:

  • 相关替换它在这里讨论stackoverflow.com/questions/6156550/…
  • 重新更新:答案提到了优点:越来越早。关于其他代码,这是一个时间问题。还有一些“为时过早”。

标签: c# .net wpf c#-4.0


【解决方案1】:

对于在 Visual Studio 中使用新建项目向导生成的 WPF 独立应用程序,应用程序的入口点是在 App.g.cs(生成的代码)中定义的 Main 函数。在默认项目中,这是 public static void App.Main 方法。

一般来说,.NET 应用程序将使用任何名为 Main 且具有公共/静态访问修饰符的方法作为其入口点(调用的第一个函数)——无论 Main 位于哪个类中。

如果您的应用程序有多个具有公共静态 Main 方法的类,您需要在项目属性对话框中指定入口点。在 Startup object 下拉列表中,选择包含应在启动时调用的 Main 方法的类。

【讨论】:

  • 但是 OP 可以更新 App.g.cs 中的代码并用于他的目的吗?从普通的 App.xaml.cs 中,我验证了“Main”方法不能被覆盖/重用。那么,有什么意义呢?
  • 它说的是 App.g.i.cs,而不是 App.g.cs。
  • @Ron16:关键是还有一个Main——它的内容显示了如何启动一个WPF应用程序。虽然您无法自定义生成的入口点,但您可以构建自己的执行相同操作的入口点(可能在配置应用程序之后)。
  • 赞成解释项目的启动可以在项目属性中设置。当app.xaml.cs 代码隐藏文件有多个潜在入口点时,这很有用。
【解决方案2】:

您的主要入口点是对 App.Xaml 代码隐藏中的 OnStartup 的覆盖:

public partial class App : Application
{
    protected override void OnStartup(StartupEventArgs e)
    {
        base.OnStartup(e);
        // here you take control
    }
}

其他兴趣点可能是 Application.OnActivate() 以及 MainWindow 的 Loaded 和 Initialized 事件。

如果我必须启动一些线程或服务,应该在哪里编写启动它们的代码?

取决于这些线程/服务需要什么。

【讨论】:

  • 嗯,线程可以在应用程序启动时立即启动,而服务应该在用户单击 UI 上的按钮时启动。在这种情况下,我认为可以在OnStartup方法中启动线程,而服务应该在UI准备好后启动。这是正确的吗?
  • 我不/不知道。取决于他们做什么。需要 UI 的线程应该稍后启动。
  • 我们为什么要打电话给base.OnStartup(e)
  • 当我在 Visual Studio 中执行 Ctrl-F 搜索时,为什么这个 Main() 不出现?我选择了“整个解决方案”。
  • @AltianoGerung 这只是一种很好的形式。当我们覆盖超类上的方法时,通常我们只是想要一种在不中断流程的情况下进入流程的方法。我们可能不知道该方法到底是什么/有一天可能对这个州做了什么,所以保存它是最安全的。
【解决方案3】:

WPF 应用程序的 Main 是自动生成的,可以在支持您的 App.xaml 文件的 .cs 文件之一中找到。您可以在解决方案资源管理器中展开 App.xaml -> App.xaml.cs -> App -> Main(),这会将您带到 App.g.i.cs 源文件,其中包含您的 Main() 函数。

此文件是自动生成的,因此我建议您在项目中创建一个包含 Main() 函数的新 .cs 文件,而不是在那里编辑 Main。然后,您必须更改项目的属性以指定正确的启动对象。这是在项目属性中的应用程序选项卡上完成的。将其设置为包含您的自定义 Main 函数的类。

您可能希望将自动生成的 Main 的包含内容复制到新的 Main 中,因为您希望您的应用程序正常运行(显示主窗口等)。

【讨论】:

  • 在解决方案资源管理器中哪里可以找到 App.g.i.cs?
  • @KyleDelaney 通常在 obj/Debug 中。对于这样的任何问题,您可以在 Visual Studio 中打开文件(即使用此答案中提到的方法)并将鼠标悬停在文本编辑器中带有文件名的选项卡上。
【解决方案4】:

入口点通常是 App.xaml.cs。

理想情况下,您希望避免将代码放在那里。而是尝试在 MVVM 的视图模型中实例化它们。这通常是一个很难找到东西的地方 - 正如您的问题所证明的那样。

另一种选择,将它们加载到帮助程序类中,然后在 app.xaml 文件中对其进行实例化。

【讨论】:

  • 一个文件不能确定该特定文件中的起点在哪里。这只是一个文件。
  • 除非修改,否则这个文件里面只有一个方法,应该很明显。
  • @kidshaw - 未更改它有一个空类(0 个方法)。
  • @henkholterman 真的吗?我检查的解决方案中有一个构造函数。一定是被另一个开发者放在那里的。我仍然坚持我的答案,它存在,但有更聪明的地方可以放置逻辑,我相信你已经回答了。
  • 它可以依赖于框架版本。在 VS 2013 中它是空的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-30
  • 2022-09-27
  • 2016-11-16
  • 1970-01-01
  • 2021-11-24
  • 1970-01-01
  • 2014-05-19
相关资源
最近更新 更多