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

ror*_*.ap 26 .net c# vb.net winforms visual-studio-2013

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

在此输入图像描述

但不是在设计师:

在此输入图像描述

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

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

Sri*_*vel 27

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

[Browsable(false)]
[EditorBrowsable(EditorBrowsableState.Advanced)]
public event EventHandler HandleCreated;
Run Code Online (Sandbox Code Playgroud)

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

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

其他一些属于相同类别的事件的好例子是ControlAdded,ControlRemoved等等.你可以看到这些不是很重要,它们对设计师是隐藏的.

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

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

类型this.HandleCreated +=,然后tab,tab.

Ide将为您提供活动.

  • @roryap这是一个我无法回答的问题.你需要问参与设计的msft工程师:) (11认同)
  • 另一个有趣的案例,如果[`TextBoxBase.Paint`](https://msdn.microsoft.com/en-us/library/system.windows.forms.textboxbase.paint%28v=vs.90%29.aspx)事件特别标记为不可浏览的,即使通过`Control.Paint`方法也是可浏览的.这是因为`TextBoxBase`类永远不会实际引发事件,我假设设计师想要通过阻止人们注册处理程序来消除混淆(尽管当你试图找出事件发生的地方时它会增加一些混乱) ). (2认同)
  • @Anthony True,这实际上是不同的.与类无关的事件,属性,方法(它们只是因为基类具有它而存在)也将被隐藏.值得注意的是,这违反了LSP (2认同)

Han*_*ant 16

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

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

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

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