2013-03-05 149 views
6

我長時間沒有成功地尋找解決這個問題的方法。F#dispatcher.invoke和委託方法

我正在將一些C#代碼移植到F#,並且我正在爲WPF元素使用Dispatcher.Invoke。由於我是F#中的總noob,我唯一能確定的是問題出現在椅子和鍵盤之間。

這裏是我的C#代碼:

foreach (var k in ChartList.Keys)    
     { 
      ChartList[k].Dispatcher.Invoke(
       System.Windows.Threading.DispatcherPriority.Normal, 
       new Action(
       delegate() 
       { 
        ChartList[k].Width = area.Width/totalColsForm; 
        ChartList[k].Height = area.Height/totalRowsForm; 
        ChartList[k].Left = area.X + ChartList[k].Width * currentCol; 
        ChartList[k].Top = area.Y + ChartList[k].Height * currentRow; 
        ChartList[k].doShow(); 
       } 
      )); 
     } 

我掙扎的部分是新的行動(委託()...)。編譯器不喜歡我翻譯它的任何嘗試。

這段代碼在F#中的翻譯是什麼?

+0

你試圖做什麼?我期望'fun() - > ...'或者'Action(fun() - > ...)'工作。 – Daniel 2013-03-05 15:51:31

+0

@丹尼爾,正是我嘗試都沒有成功。我得到了錯誤「沒有重載匹配的方法」Invoke'「=>它是委託方法的翻譯是問題 – Anass 2013-03-05 16:18:19

回答

6

Invoke方法有幾個重載,所以如果你在動作中有不完全正確的東西,你可能會有一些奇怪的錯誤,因爲類型檢查器不知道要調用哪個超載。我只是試過這個,它工作得很好:

open System 
open System.Windows.Controls 
open System.Windows.Threading 

let b = Button() 
b.Dispatcher.Invoke(
    DispatcherPriority.Normal, 
    Action(fun() -> 
     b.Content <- "foo" 
    )) |> ignore 
+0

Thx Gustavo,我試過你的代碼,但我仍然有同樣的錯誤,我得到的是」無效使用接口類型「,而術語」行動「則加下劃線。 我想出了一個我自己的解決方案。我宣佈明確 型my_delegate =單位的代表 - >單元 和我的代碼變得 對於k在ChartList.Keys做 ChartList [K] .Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Normal,新。 my_delegate(fun() - > ChartList。[k] .doShow()))|>忽略 代碼編譯但我仍然不明白爲什麼使用Action會引發錯誤 – Anass 2013-03-05 17:00:44

+0

您是否碰巧有任何接口行動?嘗試拼出System.Action – 2013-03-05 17:06:52

+0

它的工作!感謝古斯塔沃,但我不明白我擁有所需的所有參考,以及所需的開放語句。奇! – Anass 2013-03-05 17:13:33