2013-03-05 12 views
6

Szukałem rozwiązania tego problemu przez długi czas bez powodzenia.F # dispatcher.invoke i delegate method

Przenoszę niektóre z mojego kodu C# do F # i walczę z Dispatcher.Invoke dla elementu WPF. Ponieważ jestem totalnym noobem w F #, jedyną rzeczą, na którą jestem pewien, jest to, że problem leży między krzesłem a klawiaturą.

Oto mój kod 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(); 
       } 
      )); 
     } 

Część walczę o to nowe działanie (delegat() ...). Kompilatorowi nie podobała się żadna z moich prób jego przetłumaczenia.

Jakie byłoby tłumaczenie tego fragmentu w języku F #?

+0

Co próbowałeś? Spodziewałbym się, że 'fun() -> ...' lub 'Action (fun() -> ...)' zadziała. – Daniel

+0

@ Daniel, dokładnie próbowałem obu bez powodzenia. Otrzymałem komunikat "Żadne przeciążenia nie pasują do metody" Invoke "" => jest to tłumaczenie metody delegata, która jest problemem – Anass

Odpowiedz

6

Metoda Invoke ma kilka przeciążeń, więc jeśli coś nie jest dokładnie w środku akcji, może pojawić się kilka dziwnych błędów, ponieważ sprawdzanie typu nie będzie wiedzieć, które przeciążenie wywołać. Właśnie próbowałem tego i działało dobrze:

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, próbowałem twojego kodu, ale wciąż mam ten sam błąd, który dostałem wcześniej, który jest "Nieprawidłowy użycie typu interfejsu ", podczas gdy termin Działanie został podkreślony. Wymyśliłem własne rozwiązanie. Oświadczyłem wyraźnie typ my_delegate = delegat jednostki -> jednostka a mój kod stał k w ChartList.Keys zrobić ChartList [k] .Dispatcher.Invoke (System.Windows.Threading.DispatcherPriority.Normal, nowych. my_delegate (fun() -> ChartList. [k] .doShow())) |> ignore kod skompilowany, ale nadal nie rozumiem, dlaczego użycie działania powoduje błędy – Anass

+0

Czy zdarzyło Ci się mieć interfejs o nazwie Akcja? Wypróbuj system. Akcja –

+0

Zadziałało! dziękuję Gustavo, ale nie rozumiem, że mam wszystkie potrzebne referencje z potrzebnymi otwartymi stwierdzeniami. dziwny! – Anass