2014-01-11 40 views
0

我有两个按钮,我想合并它们的点击事件,然后等待它们中的任何一个被点击(使用异步),然后根据哪个按钮被按下,我想要执行不同的操作。合并两个事件,检测哪个被触发

我一直在尝试使用Async.AwaitObservableObservable.merge但我无法得到它的工作(它甚至还存在?)和我一直在试图用Observable.map到returnvalues分配给该事件,但我不能得到任何工作。

我想使用匹配表达式来执行基于单击按钮的不同操作。

故事时间:
这是为了防止我的程序有可变性。
我的程序是一个使用Windows窗体和f#的绘图程序。
它应该能够绘制两个不同的形状,我不想通过使用mutable来跟踪我正在使用哪个“工具”,所以我想等待事件并从那里确定。

回答

0

由于没有Async.AwaitObservable方法(至少在我的系统上),使用Async.AwaitEventEvent模块的等效功能而不是Observable应该可以工作。

type WhichButton = B0Clicked | B1Clicked 

let clicks = 
    ( b0.Click |> Event.map (fun _ -> B0Clicked) , 
     b1.Click |> Event.map (fun _ -> B1Clicked)) 
    ||> Event.merge 

let waitForClicks() = async{ 
    while true do 
     let! clicked = Async.AwaitEvent clicks 
     match clicked with 
     | B0Clicked -> printfn "Button 0" 
     | B1Clicked -> printfn "Button 1" } 
相关问题