2010-01-25 2 views
4

Я пытаюсь добавить & удалить обработчик событий из Silverlight FrameworkElement, но я просто не могу получить синтаксис правильно.F #: Добавить и удалить обработчики событий

Я хочу сделать что-то вроде этого:

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

Каким должен быть правильный способ сделать это?

+0

Если вы не беспокоитесь об удалении обработчика, вы можете использовать Add. 'fe.MouseLeftButtonDown.Add (clickedEventHandler)' – gradbot

ответ

5

Как уже упоминалось, вам необходимо создать экземпляр делегата:

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

Затем вы можете использовать ch как аргумент AddHandler или RemoveHanlder. Причина в том, что значение функции F # фактически не представлено в виде любого типа делегата. У этого есть свой тип, который не является делегатом (см. Также another SO discussion). Вы можете увидеть разницу, если вы посмотрите на типы в F # интерактивные (или VS IntelliSense):

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

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

Что может сбивать с толку то, что F # также позволяет неявное преобразование из значения функции лямбда к совместимому типу делегата при звонке метод, однако это работает только тогда, когда вы даете функцию лямбда непосредственно в качестве аргумента (я думаю):

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

еще одна причина, почему вы все еще нуждаются делегатов в F # является то, что делегаты имеют четко определенную семантику сравнения (они по сравнению с любыми другими ссылочными типами). Для функций спецификация F # не говорит, когда они равны.

2

В этом случае получается, что вы можете сделать следующее:

let clickedEventHandler = new MouseButtonEventHandler(fun obj args -> printfn "Click!") 
fe.MouseLeftButtonDown.AddHandler(clickedEventHandler) 
... 
fe.MouseLeftButtonDown.RemoveHandler(clickedEventHandler) 
Смежные вопросы