2010-01-25 5 views
4

J'essaie d'ajouter & supprimer un gestionnaire d'événements à partir d'un Silverlight FrameworkElement, mais je ne peux pas obtenir la syntaxe correcte.F #: Ajouter et supprimer des gestionnaires d'événements

Je veux faire quelque chose comme ceci:

let clickedEventHandler = fun args -> printfn "Click!" 
fe.MouseLeftButtonDown.AddHandler(clickedEventHandler) 
... 
fe.MouseLeftButtonDown.RemoveHandler(clickedEventHandler) 

Quelle devrait être la bonne façon de le faire?

+0

Si vous ne souhaitez pas supprimer le gestionnaire, vous pouvez utiliser Ajouter. 'fe.MouseLeftButtonDown.Add (clickedEventHandler)' – gradbot

Répondre

5

Comme vous l'avez mentionné, vous devez créer une instance de délégué:

let ch = new MouseButtonEventHandler(fun obj args -> 
    printfn "Click!") 

Ensuite, vous pouvez utiliser ch en tant qu'argument à AddHandler ou RemoveHanlder. La raison en est que la valeur de la fonction F # n'est réellement représentée en tant que type de délégué. Il a son propre type, qui n'est pas un délégué (voir aussi another SO discussion). Vous pouvez voir la différence si vous regardez les types de F # interactive (ou VS IntelliSense):

> (fun (o:obj) (a:MouseButtonEventArgs) -> printfn "Click!") 
val it : obj -> MouseButtonEventArgs -> unit = (...) 

> new MouseButtonEventHandler(fun o a -> printfn "Click!") 
val it : MouseButtonEventHandler = (...) 

Ce qui peut être source de confusion est que F # permet également la conversion implicite de valeur de la fonction lambda à un type délégué compatible lorsque vous appelez un méthode, mais cela ne fonctionne que lorsque vous donnez une fonction lambda directement comme argument (je pense):

fe.MouseLeftButtonDown.AddHandler(fun obj args -> 
    printfn "Click!")   

une autre raison pour laquelle vous avez encore besoin de délégués en F # est que les délégués ont une sémantique de comparaison bien définies (ils sont comparé comme tout autre type de référence). Pour les fonctions, la spécification F # ne dit pas quand elles sont égales.

2

Dans ce cas, il se trouve que vous pouvez faire ce qui suit:

let clickedEventHandler = new MouseButtonEventHandler(fun obj args -> printfn "Click!") 
fe.MouseLeftButtonDown.AddHandler(clickedEventHandler) 
... 
fe.MouseLeftButtonDown.RemoveHandler(clickedEventHandler) 
Questions connexes