2010-08-14 26 views
3

在C#中,可以用Keys.Control | Keys.M的形式表示KeyPress事件的字符。在F#中,Keys.Control ||| Keys.M不起作用。什麼?如何在F#中表達(Keys.Control | Keys.M)?

編輯:確實很有意思。根據JohannesRössel在F#交互式窗口中的建議使用System.Windows.Forms.Keys.Control ||| System.Windows.Forms.Keys.M完全按照他的說法工作。將其寫入.fs文件:

form.KeyPress.Add (fun e -> 
     if (e.KeyChar = (System.Windows.Forms.Keys.Control ||| System.Windows.Forms.Keys.M)) then textbox.SelectAll()) 

給我錯誤The type 'char' does not support any operators named '|||'。所以我可能錯誤地標識了問題的位置。沒有從Keys到字符的類型轉換。

+0

「不工作」非常模糊。也許你可以改爲發佈特定的錯誤。 – Gian 2010-08-14 22:51:08

回答

2

使用+

Keys.Control + Keys.M 

FWIW,|||作品對我來說,雖然:

> System.Windows.Forms.Keys.Control ||| System.Windows.Forms.Keys.M;; 
val it : System.Windows.Forms.Keys = M, Control 
+0

你是對的,我修改了問題以顯示我出錯的地方。在這種情況下,'+'和'|||'有什麼區別? – 2010-08-14 23:26:01

+0

@Muhammad:'|||'是按位或運算符。 '+'是加法。 – 2010-08-15 03:07:59

4

只是有點除了Johaness羅塞爾的回答,有更好(或 '更多功能')的方式來用反應式編程來做到這一點

form.KeyDown 
    |> Event.filter (fun e -> e.KeyData = (Keys.Control + Keys.M)) 
    |> Event.map (fun _ -> textbox.SelectAll()) 
    |> ignore 
+1

我想你可以使用'Event.add'而不是'Event.map',然後刪除'|> ignore'。 – kvb 2010-08-15 12:41:09

+0

@Matajon,謝謝。稍後我會看FRP。我只是翻譯了我已經從IronPython獲得的一個工具,但我沒有時間使它更加實用。 – 2010-08-16 01:25:27