2012-05-18 2 views
2

WPF 컨트롤에는 동일한 인터페이스 또는 기본 클래스를 공유하지 않고 동일한 이름을 가진 많은 이벤트 멤버가 있습니다. F #의 유형 제약은 동일한 멤버가있는 모든 객체에서 작동하는 쓰기 기능을 사용 가능하게합니다. 그런 다음 이벤트 멤버에 대한 유형 제약 조건을 쓸 수 있다면 카레 함수 마녀를 작성하면 많은 컨트롤에서 같은 방식으로 속성 설정을 쉽게 할 수 있습니다.이벤트 멤버에 대한 유형 제약 조건 작성 방법은 무엇입니까?

open System.Windows.Controls 
let inline click handler control = 
    (^T:(member Click:IEvent<_,_>)control) 
    .Add handler 

Button() 
|> click (fun _ ->()) // error! 

MenuItem() 
|> click (fun _ ->()) // error! 

type A() = 
    [<CLIEvent>] 
    member __.Click = Event<_>().Publish 
A() |> click (fun _ ->()) // It works! but IntelliSense shows the member as "event A.Click .." 

그러나 위의 코드가 작동하지 않습니다 .. 나는 이벤트 회원이 불가능한 것은 작은 문제이기 때문에 .. 을 형 제약 조건을 작성하고 우리는 언어 기능에 의해 모든 작은 문제를 해결하는 경우, 언어 추측 아무도 쓸 수 없을 정도로 복잡해질 것입니다! (현재 F #은 강력하고 단순 해 보입니다)

그런 다음이 probrem을 해결할 수있는 대체 방법이 있는지 알고 싶습니다.

+0

답변을 게시하는 것이 가장 좋을 것입니다. 자신의 대답을 수락 할 수 있습니다. –

+0

내 질문에 대답하기 위해 8 시간을 기다려야합니다. 1 시간 후에 대답하겠습니다. 감사! – nagat01

답변

1

이 질문을 게시 한 후에 직접 해결했습니다. add_ * 및 remove_ * 메서드를 호출하여 이벤트 멤버에 액세스 할 수 있습니다. 그리고 타입 제약은 메소드 호출과 함께 작동합니다. 감사!

let inline click handler control = 
    let handler = RoutedEventHandler(fun _ e -> handler e) 
    (^T:(member add_Click:RoutedEventHandler->unit)control,handler) 

Button() |> click (fun _ ->()) // works! 
MenuItem() |> click (fun _ ->()) // works! 
관련 문제