【问题标题】:How can I detect when a TTreeViewItem node was expanded inside a TTreeView?如何检测 TTreeViewItem 节点何时在 TTreeView 内展开?
【发布时间】:2023-12-29 05:16:01
【问题描述】:

我在表单上有一个TTreeView,它有很多TTreeViewItem 节点。

我只想在用户展开TTreeViewItem 节点之一时调用某个函数(这并不一定意味着用户“选择”了其中一个节点)。

我已尝试使用以下处理程序捕获此事件:

TTreeView.OnChange
TTreeView.OnClick
TTreeView.OnMouseDown
TTreeViewItem.OnClick
TTreeViewItem.OnMouseDown

但是当我只单击可展开节点左侧的可爱小箭头时,似乎都没有触发这些。

有没有办法在用户展开TTreeViewItem时得到通知?

【问题讨论】:

  • 在 TTreeViewItem 上有一个私有方法 DoButtonClick。您可以尝试使用它。
  • 简单地重新分配TTreeViewItem.FButton.OnClick 事件可能比直接挂钩TTreeViewItem.DoButtonClick() 更容易。或者也许有一种方法可以为“按钮”样式资源指定自定义对象?如果是这样,您可以尝试拦截TTreeViewItem 发送给它的StartTriggerAnimation('IsExpanded') 通知。
  • Firemonkey 的 TreeView 缺少报告节点何时折叠或展开的功能,但您可以在这篇文章中找到解决方法Adding OnChangeExpanded Functionality to TTreeView

标签: delphi firemonkey delphi-xe3


【解决方案1】:

不幸的是,FireMonkey 中的TTreeViewTTreeViewItem 在节点展开/折叠时不会公开任何公共事件。

我看到的唯一内容是单击节点的展开/折叠按钮时的私有 TTreeViewItem.DoButtonClick() 事件处理程序,以及当节点的 IsExpanded 属性更改值时发送到同一按钮的 StartTriggerAnimation('IsExpanded') 通知。

实际的按钮对象是从TTreeView 的样式中获得的,所以也许有一种方法可以对该对象进行子类化,以便您可以覆盖StartTriggerAnimation(),或者至少为其添加一个隐藏的子对象作为默认的@987654328 @实现通知子控件发送到父控件的相同触发器。

【讨论】: