gpt4 book ai didi

wpf - UIElement.add_MouseDown 在 f# 中来自哪里?

转载 作者:行者123 更新时间:2023-12-04 20:48:37 25 4
gpt4 key购买 nike

我试图理解为什么以下代码有效(取自 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 不同。我实际上一直在做的是使用两种不同的方法一个接一个地添加两个事件处理程序:

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

这会弹出两个消息窗口,第一个显示窗口内的正确位置,第二个显示另一个愚蠢的位置。但是,如果我真的用 addHandler 调用替换了 add_MouseDown 调用,那么我会得到相同的结果。

所以对于这一部分,我认为我真正的问题是为什么第二个事件处理程序报告不同的位置。但也许这最好作为一个单独的问题来处理。

最佳答案

我不确定为什么它不起作用,但您可以通过将闭包传递给 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 参数要好。也许它会按预期工作?

关于wpf - UIElement.add_MouseDown 在 f# 中来自哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12432595/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com