1

我试图弄清楚如何从事件单击中访问鼠标单击的指针位置。我想出了类似的东西

[...]
    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)
         ]
[...]

但这需要一个控制句柄来代替??? ,我无权访问。还有其他方法吗?或者一种获得控制权的方法?

可能我错过了一些东西。

4

1 回答 1

1

您可以使用(或任何其他)Source上的属性来获取对触发控件的引用。PointerPressedEventArgsRoutedEventArgs

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)
                 ]
         ]
    ]

另请注意,您需要设置Backgrounda 的属性,Canvas否则您将无法获得PointerPressed事件。

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

于 2020-02-26T19:27:17.893 回答