3

次のコードが機能する理由を理解しようとしています ( http://jyliao.blogspot.com/2007/10/learning-wpf.htmlから取得):

open System
open System.Windows
open System.Windows.Input

(* From Chap 1 - HandleAnEvent.cs *)
let WindowOnMouseDown sender (args:MouseButtonEventArgs) =
   let win = unbox<Window> sender
   let str = sprintf "Window clicked with %A button at point (%A)" args.ChangedButton (args.GetPosition win)
   MessageBox.Show(str)|>ignore

let win = new Window()
win.Title <- "Handle an Event"
win.add_MouseDown(new MouseButtonEventHandler(WindowOnMouseDown))

#if COMPILED
[<STAThread()>]
do 
    let app =  new Application() in
    app.Run(win) |> ignore
#endif

私が理解していない部分は への呼び出しadd_MouseDownです。マウスを VS の呼び出しに合わせると、メソッドが UIElement クラスからのものであることがわかりますが、.NET クラス ライブラリでこのメソッドへの参照が見つかりません。

F# では、呼び出しは次のようになると予想していました。

win.MouseDown.AddHandler (new MouseButtonEventHandler(WindowOnMouseDown))

この変更を行うと、ポップアップするメッセージ ボックスに、クリックしたウィンドウ内の座標が表示されなくなります。代わりに、ウィンドウ内のマウス クリックの位置とは独立した座標を表示しますが、画面上でウィンドウを移動すると変化します。senderそのため、パラメータがウィンドウ以外の UI 要素を参照しているようです。

add_MouseDown の使用が機能する理由 (およびこのメソッドの存在が文書化されている場所) と、AddHandler の使用が機能しない理由を理解している人はいますか?

VS2010、F# 2.0、.NET 3.0 ライブラリを使用しています。

アップデート:

ああ、 AddHandler を使用すると add_MouseDown を使用した場合とは異なる動作をするという私が間違っていたことに気付きました。私が実際に行っていたのは、2 つの異なるアプローチを使用して、2 つのイベント ハンドラーを次々に追加することでした。

win.add_MouseDown(new MouseButtonEventHandler(WindowOnMouseDown))
win.MouseDown.AddHandler (new MouseButtonEventHandler(WindowOnMouseDown))

これにより、2 つのメッセージ ウィンドウがポップアップ表示されます。1 つ目はウィンドウ内の正しい位置を示し、2 つ目は別のおかしな位置を示しています。しかし、本当に add_MouseDown 呼び出しを addHandler 呼び出しに置き換えると、同じ結果が得られます。

したがって、この部分についての私の本当の疑問は、なぜ 2 番目のイベント ハンドラーが別の位置を報告するのかということだと思います。しかし、おそらくそれは別の質問として扱うのが最善です。

4

2 に答える 2

2

なぜ機能しないのかわかりませんが、クロージャーをに渡すことで同じことを達成できますAdd

let win = Window()
win.MouseDown.Add(fun args ->
  let str = sprintf "Window clicked with %O button at point (%O)" args.ChangedButton (args.GetPosition(win))
  MessageBox.Show(str) |> ignore)

これで、何が参照されているかが明確winになりました (ボックス化解除の必要はありません)。senderとにかく、これは型のないパラメーターよりも優れています。多分それは期待どおりに動作しますか?

于 2012-09-14T22:29:36.190 に答える
0

add_MouseDownイベントのaddアクセサーの名前です。 C# では、このメソッドは次のように記述して呼び出されます。 VB.Net では、 と記述して呼び出します。MouseDown
win.MouseDown += ...
AddHandler(win, AddressOf ...)

F# にはイベント ハンドラーを追加するための特別な構文がないため、明示的に呼び出す必要があります。

于 2012-09-14T22:09:45.157 に答える