过滤事件时,为什么某些GUI控件的类型intellisense / type推断存在差异

时间:2016-05-16 06:17:25

标签: .net winforms visual-studio f#

我观察到,根据控件的类型,VS有时会正确地识别它所属的类型,但有时候它会坚持一个有点笼统的EventArgs

这是一些Winforms / .Net工件吗?

例如,在这种情况下,我在表单上有一些选项卡(f1)。 x将被正确识别为TabControlEventArgs,我可以插入其中。

f1.tabControl1.Selected
    |> Event.filter (fun x -> x.TabPage.Name <> "Tab3")
    |> Event.add (fun _ -> f1.comboBox2.Enabled <- false) 

enter image description here

但在下面的情况中,x只显示EventArgs,我必须明确标识属性:

f1.my2CheckBox.CheckedChanged
    |> Event.filter (fun x ->  not f1.my2CheckBox.Checked)
    |> Event.add (fun x -> f1.comboBox2.Enabled <- false)

enter image description here

我认为这是因为某些控件传递了有关其事件的更多信息而不是其他控件。是否存在特定原因,或者这只是一个实现细节,基于某些控件可以执行的操作,因此例如对于tabcontrol,访问其页面是有意义的。

1 个答案:

答案 0 :(得分:7)

  

这是一些winforms / .Net工件吗?

它不是特别针对Windows窗体,因为你可以在任何地方看到它...它只取决于使用哪个委托类型来声明事件。例如,TabControl.Selected的类型为TabControlEventHandler,声明为:

public delegate void TabControlEventHandler(object sender, TabControlEventArgs e)

...而CheckBox.Changed被声明为EventHandler类型,声明为:

public delegate void EventHandler(object sender, EventArgs e)

如果你在自己的代码中做同样的事情,你会看到完全相同的差异。基本上,当您声明一个事件时,您可以选择事件处理程序类型的具体方式,并且控件作者采用了不同的方法。对于CheckBoxChanged,您可以轻松地向复选框询问其新状态。