2012-01-23 7 views
2
canvas.MouseMove.Add(move canvas update) 

MouseMove.Add(p1 p2 p3) 

通常、私はこの使用してドキュメントを参照して、2つのparams - (オブジェクト送信者、MouseEventArgs e)の - 私はF#のから取ったこのサンプルコード、に移動し、キャンバスであることを要します。 NETジャーナルの 計算幾何形状:速い船体。F#WPFのMouseMoveのparamsは

更新は一部相違していますか?バブル情報をMouseMove.Addにルーティングしますか?

私はちょうどそれをgettngしていません。助けを歓迎します。ありがとう。アート

あなたがタイプミスを持っていない限り

答えて

5

kvbの答えはすべての理論を示しているので、コードサンプルを追加することもできます。スニペットのソースはわからないので、名前に基づいて推測をいくつか行います。元のサンプルと完全に同じでなくても便利です。 KVBが言うよう

は、コードmove canvas updateは、実際の関数呼び出しである戻り次いでMouseMoveイベントに対するハンドラとして追加される機能。

これは、次のようにmoveを宣言することができることを意味します:

let move (canvas:Canvas) (update:unit -> unit) (me:MouseEventArgs) = 
    // This function gets called when the mouse moves 
    // - values me.X and me.Y give the current mouse location 
    // - we can access 'canvas' that was declared when registering handler 
    // - we can call 'update' to do some more work... 
    // Pseudo-example: 
    canvas.Children.[0].Width <- me.X 
    update() 

イベントハンドラを登録する場合、ハンドラだったcanvas値にアクセスできるように、コードmove canvas updateは、move関数の最初の二つの引数を指定しますおそらくハンドラが登録されている場所で宣言されています(可変変数を使用せずに)。

let canvas = new Canvas() // Create canvas 
let update() = ... // some function that performs update 

// Register handler and give it canvas and update as first two arguments 
canvas.MouseMove.Add(move canvas update) 

これは、 eイベントハンドラは、最初の引数としてsender:objectを取る必要はありません。部分関数アプリケーションを使用して、最初の引数としてcanvas(送信側)を渡すことができます(したがって、キャストする必要はありません)。objectCanvas)。

+0

本当にみんなF#FUN F#FUN FUN! (可変変数を使用しないで!)私は実際にそれを得ることを確認するために、詳細を調べていますが、正しい方向に私を指摘してくれてありがとう。私はC#F GUIインターフェースのC#を考えていました。私はFUNCTIONALを考える必要がある!試してみる。val move:IInputElement - >(int - > unit) - > Input.MouseEventArgs - > unit –

4

は、move canvas updateは値canvasupdate、あなたが表示されているの誰にも負けない機能moveのアプリケーションです。これは渡される3つの別々の引数のセットではありません。

一般に、F#イベントでは、他の.NET言語とは多少異なる働きをします。 Addメソッドを使用すると、送信者とイベントの引数ではなく、サブクラスEventArgsを1つ使用する関数を渡します。ハンドラ内から送信者にアクセスする場合は、代わりにAddHandlerを使用してください。通常、送信者はハンドラを追加しているオブジェクトなので、これは必ずしも必要ではないため、ハンドラ内から別の参照を取得する必要はありません。

+1

私は、 'move'は3つのパラメータを取ると思います.3番目のパラメータは' MouseEventArgs'です。その場合、これは、単一の 'MouseEventArgs'パラメータを持つ関数である' Add'によって期待される関数シグネチャを得るために、最初の2つのパラメータを関数に部分的に適用するだけです。 –

+0

@Joel - そうだね。しかし、 'move'と' update'がどのように定義されているかを知らなければ、その例が何をしているのかを正確に説明するのは難しいです。 – kvb