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

s95*_*163 3 .net f# visual-studio winforms

我观察到,根据控件的类型,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) 
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

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

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

在此输入图像描述

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

Jon*_*eet 7

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

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

public delegate void TabControlEventHandler(object sender, TabControlEventArgs e)
Run Code Online (Sandbox Code Playgroud)

...而CheckBox.Changed声明为type EventHandler,声明为:

public delegate void EventHandler(object sender, EventArgs e)
Run Code Online (Sandbox Code Playgroud)

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