rys*_*ama 5 silverlight f# event-handling
我正在尝试从Silverlight FrameworkElement添加和删除事件处理程序,但我无法使语法正确.
我想做这样的事情:
let clickedEventHandler = fun args -> printfn "Click!"
fe.MouseLeftButtonDown.AddHandler( clickedEventHandler)
...
fe.MouseLeftButtonDown.RemoveHandler(clickedEventHandler)
Run Code Online (Sandbox Code Playgroud)
这样做的正确方法是什么?
正如您已经提到的,您需要创建一个委托实例:
let ch = new MouseButtonEventHandler(fun obj args ->
printfn "Click!")
Run Code Online (Sandbox Code Playgroud)
然后你可以ch用作AddHandler或参数RemoveHanlder.原因是,F#函数值实际上并未表示为任何委托类型.它有自己的类型,不是代表(另见SO讨论).如果查看F#interactive(或VS IntelliSense)中的类型,您可以看到差异:
> (fun (o:obj) (a:MouseButtonEventArgs) -> printfn "Click!")
val it : obj -> MouseButtonEventArgs -> unit = (...)
> new MouseButtonEventHandler(fun o a -> printfn "Click!")
val it : MouseButtonEventHandler = (...)
Run Code Online (Sandbox Code Playgroud)
可能令人困惑的是,F#还允许在调用方法时从lambda函数值隐式转换为兼容的委托类型,但是只有在直接将lambda函数作为参数时才会起作用(我认为):
fe.MouseLeftButtonDown.AddHandler(fun obj args ->
printfn "Click!")
Run Code Online (Sandbox Code Playgroud)
您仍然需要F#中的委托的另一个原因是委托具有明确定义的比较语义(它们与任何其他引用类型进行比较).对于函数,F#规范没有说明它们何时相等.