如何从 Avalonia.FuncUI 中的事件中获取点击位置

How to get click position from event in Avalonia.FuncUI

我想弄清楚如何从事件单击访问鼠标单击的指针位置。 我想到了

[...]
    type State = { coords: Point list }

    type Msg = Click of Point

    let update (msg: Msg) (state: State) : State =
        match msg with
        | Click p -> { state with coords = p::state.coords }


    let view (state: State) dispatch =
        Canvas.create [
             Canvas.onPointerPressed (fun event -> event.GetPosition ??? |> Click |> dispatch)
         ]
[...]

但这需要一个控件句柄来代替 ???,我无法访问它。 还有别的办法吗?或者获取控件句柄的方法?

可能我遗漏了什么。

您可以在 PointerPressedEventArgs(或任何其他 RoutedEventArgs)上使用 Source 属性 来获取对射击控制的引用。

let view (state: State) dispatch =
    Canvas.create [
         Canvas.background "white"
         Canvas.onPointerPressed (fun event -> event.GetPosition (event.Source :?> IVisual) |> Click |> dispatch)
         Canvas.children [
             for point in state.coords do
                 yield Ellipse.create [
                     Ellipse.width 5.0
                     Ellipse.height 5.0

                     Ellipse.fill "red"
                     Ellipse.top (point.Y - 2.5)
                     Ellipse.left (point.X - 2.5)
                 ]
         ]
    ]

另请注意,您需要设置 CanvasBackground 属性 否则您不会获得 PointerPressed 事件。

如果要使用上面的示例,还需要打开Avalonia.Controls.Shapes命名空间(因为Ellipse)。