Avalonia FuncUI PointerPressedEventArgs,如何在不使用反射的情况下访问受保护的成员?

问题描述 投票:0回答:1

在我的 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()
  )
]
f# protected avalonia
1个回答
0
投票

感谢 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()
    )
  ]

后来我发现该事件发生了两次,我怀疑这是因为按下和释放按钮都需要调用它。

© www.soinside.com 2019 - 2024. All rights reserved.