在我的 F# Avalonia FuncUI 桌面应用程序中,我希望当用户在 FuncUI 组件中按下鼠标“后退”按钮时进行回调。我最终使用反射让它工作,如下所示。我想知道我是否缺少一种更干净或更明显的方法来做到这一点?我应该在 FuncUI github 存储库上将此问题作为问题提出吗?
open Avalonia.FuncUI
let getProtectedPropertyValue (name: string) (obj: obj) =
let propertyInfo =
obj.GetType().GetProperty(
name, BindingFlags.Instance |||
BindingFlags.NonPublic ||| BindingFlags.Public)
if propertyInfo <> null && propertyInfo.CanRead then
propertyInfo.GetValue(obj)
else
failwith $"Property '{name}' not gettable"
ctx.attrs [
Component.onPointerPressed (fun event ->
let properties =
getProtectedPropertyValue "Properties" event :?>
PointerPointProperties
if properties.IsXButton1Pressed then
DoSomething()
)
]
感谢 JL0PD 的评论,我发现了一个 Avalonia GitHub Issue,它提供了如何直接访问我想要的属性的答案,而无需求助于反射。以下是 Avalonia FuncUI 的 F# 修正代码:
open Avalonia.FuncUI
Component(fun ctx ->
ctx.attrs [
Component.onPointerPressed (fun event ->
let properties = event.GetCurrentPoint(ctx.control).Properties
if properties.IsXButton1Pressed then
event.Handled <- true // prevent second callback on pointer button release
DoSomething()
)
]
后来我发现该事件发生了两次,我怀疑这是因为按下和释放按钮都需要调用它。