次のコードが機能する理由を理解しようとしています ( 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 番目のイベント ハンドラーが別の位置を報告するのかということだと思います。しかし、おそらくそれは別の質問として扱うのが最善です。