如何从 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)
]
]
]
另请注意,您需要设置 Canvas
的 Background
属性 否则您不会获得 PointerPressed
事件。
如果要使用上面的示例,还需要打开Avalonia.Controls.Shapes
命名空间(因为Ellipse
)。
我想弄清楚如何从事件单击访问鼠标单击的指针位置。 我想到了
[...]
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)
]
]
]
另请注意,您需要设置 Canvas
的 Background
属性 否则您不会获得 PointerPressed
事件。
如果要使用上面的示例,还需要打开Avalonia.Controls.Shapes
命名空间(因为Ellipse
)。