是什么使它在设计器中不是每个事件都可用,我怎样才能像在VB.NET中那样在C#中快速生成处理程序?

是什么使它在设计器中不是每个事件都可用,我怎样才能像在VB.NET中那样在C#中快速生成处理程序?,c#,.net,vb.net,winforms,visual-studio-2013,C#,.net,Vb.net,Winforms,Visual Studio 2013,在VisualStudio表单设计器中,可以通过双击“事件”列表中的“属性”窗口来添加事件处理程序。您还可以通过在左侧下拉列表中选择关联的“事件”项,然后在右侧下拉列表中选择所需的事件,在代码视图中添加事件处理程序(至少在VB.NET中)。我的问题是:为什么有些活动只能通过后一种技术而不能通过前一种技术进行?例如,HandleCreated事件在代码视图中可用: 但不是在设计器中: 这在VB.NET中很好,因为我总是可以使用第一种技术快速生成事件处理程序。然而,在C#中,第一种技术是不可能的

在VisualStudio表单设计器中,可以通过双击“事件”列表中的“属性”窗口来添加事件处理程序。您还可以通过在左侧下拉列表中选择关联的“事件”项,然后在右侧下拉列表中选择所需的事件,在代码视图中添加事件处理程序(至少在VB.NET中)。我的问题是:为什么有些活动只能通过后一种技术而不能通过前一种技术进行?例如,
HandleCreated
事件在代码视图中可用:

但不是在设计器中:

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


是否有一些技术原因导致属性窗口中的设计器事件列表中缺少某些事件?考虑到这一点,我如何才能像在VB.NET中一样在C语言中快速生成事件处理程序呢?

嗯,它是故意隐藏的。若您查看控件类,
HandleCreated
事件被标记为
Browsable(false)
,这意味着不在属性窗口中显示它

[Browsable(false)]
[EditorBrowsable(EditorBrowsableState.Advanced)]
public event EventHandler HandleCreated;
如果你问我为什么?我不知道答案。这是一个设计决策,设计团队的任何人都必须回答这个问题

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

属于同一类别的事件的其他一些很好的例子有
ControlAdded
ControlRemoved
等。正如您所见,这些都不是很重要,它们对设计器是隐藏的

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

您无法像在VB.net中一样获得事件的组合框;您能得到的最接近的是ide支持,它可以为您自动完成(在@HenkHolterman的回答中已经提到;现在已删除)

键入
this.HandleCreated+=
,然后键入tab,tab


Ide将为您连接事件。

假设您有一个同时具有UI和非UI属性的用户控件。您需要使用
可浏览(False)
装饰非UI属性,以便它们无法通过属性窗口使用。

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

[Browsable(false)]
[EditorBrowsable(EditorBrowsableState.Advanced)]
public event EventHandler HandleCreated;
在VB.NET中,可以使用WithEvents修饰符装饰字段,这是创建“快速事件处理程序”的要求。这将转化为一个新的属性,它将为您完成所有事件注册工作。此WithEvents也是为This(或Me)指针隐式创建的。C#没有这种语法特性,因此不可能,因此必须手动执行。毕竟,VB.NET和C#之间的区别从来不仅仅是语法,几乎只是语法:)

我想原因是C#的设计目的是将关键字的数量限制在最低限度,而微软从来没有停止向VB.NET添加更多的关键字。如果考虑到语法元素,新引入到VB.NET中的关键字有两个,而不是C。他们的工作从一个相当体面的外观和感觉规范。但这就是相似之处所在,它们是由微软的两个非常不同的团队创建的,并且具有完全不同的代码基础。否则,大型软件公司、大型集团的生存战略就行不通了

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

编辑窗口顶部的两个组合框是在花岗岩基岩中铸造的。他们以前从未过滤过任何东西。如果VB.NET程序员为一个事件编写了一个事件处理程序,那么他希望总是能在组合框中找到它。另一方面,VB.NET IDE隐藏了大量信息。例如不在解决方案资源管理器窗口中显示自动生成的源文件


不要对它的工作原理做太多假设,你很可能猜错了。而且我几乎没有办法做点什么。

@roryap这是一个我无法回答的问题。您需要询问参与设计的msft工程师:)如果特别标记为不可浏览的事件(即使通过
控件.Paint
方法)是可浏览的,则另一个有趣的案例。这是因为
TextBoxBase
类实际上永远不会引发事件,我假设设计者希望通过阻止人们注册处理程序来消除混淆(尽管当您试图找出事件发生的地方时,这会增加一些混淆)。我经常发现事件和属性是隐藏的,因为它们在子类中实际无法按预期工作。TextBox有一些特别的…@Anthony-True,事实上是不同的。与类无关的事件、属性和方法(它们的存在仅仅是因为基类拥有它)也将被隐藏。值得注意的是,这是一个v