2013-03-05 8 views
6

私はこの問題の解決策を長年にわたって探していましたが、成功しませんでした。F#dispatcher.invokeとdelegateメソッド

私はC#コードの一部をF#に移植していますが、私はDispatcher.InvokeでWPF要素を扱うのに苦労しています。私はF#の全面的な騒ぎであるので、椅子とキーボードの間に問題があることは間違いないと確信しています。ここで

は、私の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

+0

@ダニエル、まさに私は両方とも成功しなかった。私はエラーが発生しました "メソッド 'Invoke'に一致するオーバーロードはありません" =>それは問題であるデリゲートメソッドの翻訳です – Anass

答えて

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、私はあなたのコードを試しましたが、私はまだ " Actionという言葉には下線が引かれていました。 私は自分自身の解決策を思いついた。私は 型my_delegate =ユニットのデリゲートを明示的に宣言 - >ユニット と私のコードは何 ChartList [K] .Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Normal、新しいChartList.Keysでkについて になりました。 コードがコンパイルされましたが、私はまだ私がなぜアクションを使用するのかわかりません – Anass

+0

あなたはどんなインターフェースを持っていますか?アクション? System.Actionのスペルを試してください –

+0

それは働いた!グスタボに感謝しますが、私は必要なすべての参考文献を必要としていることを理解していません。奇妙な! – Anass

関連する問題