是什么使得设计师不是每个事件都可用,如何在VB.NET中快速生成C#中的处理程序?

在Visual Studio窗体设计器中,可以通过双击“事件”列表中的“属性”窗口添加事件处理程序。 您还可以在代码视图中添加事件处理程序(至少在VB.NET中),方法是在左侧下拉列表中选择关联的“事件”项,然后在右侧下拉列表中选择所需的事件。 我的问题是:一些事件只能通过后一种技术而不是前者才能获得? 例如, HandleCreated事件在代码视图中可用:

在此处输入图像描述

但不是在设计师:

在此处输入图像描述

这在VB.NET中很好,因为我总是可以使用第一种技术来快速生成事件处理程序。 但是,在C#中,第一种技术是不可能的,但问题仍然存在; 也就是说,“属性”窗口中的设计器列表中不存在某些事件。 我知道创建事件处理程序的唯一方法是手动添加它,其中包括手动连接事件处理程序。

有没有什么技术可以使属性窗口中的设计器事件列表中缺少某些事件? 鉴于这是真的,我怎么能像在VB.NET中那样在C#中快速生成事件处理程序?

好吧,它是故意隐藏的。 如果查看Control类, HandleCreated事件将标记为HandleCreated Browsable(false) ,这意味着不在属性窗口中显示它。

 [Browsable(false)] [EditorBrowsable(EditorBrowsableState.Advanced)] public event EventHandler HandleCreated; 

如果你问我为什么? 我不知道答案。 这是一个设计决策,设计团队的任何人都必须回答这个问题。

我的猜测是他们隐藏了不重要的事件。 您需要多少次订阅HandleCreated ? 您通常订阅Load事件。

其他一些属于同一类别的事件的好例子是ControlAddedControlRemoved等。正如您所看到的那些并不是非常重要,它们对设计师来说是隐藏的。

如何像在VB.net中一样轻松地在C#编辑器中订阅事件?

你得到VB.net时无法获得combobox用于事件; 最接近的是你可以自动完成的ide支持(已经在@HenkHolterman的答案中提到过;现在已经删除了)。

输入this.HandleCreated += ,然后选项卡制表符

Ide将为您提供活动。

VB.NET和C#IDE只是表面上看起来一样。 他们使用相当不错的外观规格。 但这就是相似性停止的地方,它们是由微软的两个非常不同的团体创建的,并且具有截然不同的代码库。 否则,大型软件公司的生存策略,大型团体不起作用。

最重要的是,他们的目标截然不同。 C#团队拥有从头开始的奢侈品,当你没有任何人保持快乐并且没有行李可以随身携带时总是很好。 对于VB.NET团队来说并非如此,Visual Basic在很长一段时间内都是一款受欢迎的产品,具有强大的IDE支持,可追溯到25年前。 对他们来说最重要的是给他们的客户一个熟悉的体验,VB.NET已经是一个非常有争议的重大动荡。

编辑窗口顶部的两个combobox的工作方式是用花岗岩基岩铸造的。 他们从未过滤过任何东西。 如果VB.NET程序员为事件编写了事件处理程序,那么他希望总能在combobox中找到它。 它的工作原理相反,VB.NET IDE隐藏了大量信息。 就像没有在Solution Explorer窗口中显示自动生成的源文件一样。

不要对它应该如何工作做太多假设,你可能猜错了。 并且没有什么选择可以做些什么。

想象一下,您有一个具有UI和非UI属性的用户控件。 您需要使用Browsable(False)装饰非UI属性,以便它们不会通过属性窗口可用。

要回答第二个问题,您无法像在VB.NET中那样快速创建事件处理程序。 这是VB.NET与C#超出语法的区别之一。

在VB.NET中,您可以使用WithEvents修饰符来装饰字段,这是创建“快速事件处理程序”的必要条件。 这将转换为一个新属性,可以为您执行所有事件注册。 这个WithEvents也是为this(或Me)指针隐式创建的。 C#没有此语法function,因此无法实现,因此您必须手动执行此操作。 毕竟,VB.NET和C#之间的区别从来都不是语法,只是语法几乎只有:)

我想原因是C#旨在将关键字的数量限制在最低限度,而微软从未犹豫过为VB.NET添加更多关键字。 如果考虑LINQ语法元素,VB.NET中新引入的关键字比C#更多。