2

VirtualStringTree如果每个节点高度更改为不同的高度,如何刷新滚动条。因为,滚动仍然处于相同状态,导致滚动时无法查看其他节点。

toVariableNodeHeight选项不起作用?还有其他想法吗?

4

1 回答 1

3

有些事情告诉我,当您说“每个 NodeHeight 都已更改”时,您的真正意思是说您直接为NodeHeight每个节点记录的字段分配了新值。首先,不要那样做。如果您必须为节点分配高度,请通过树的NodeHeight属性分配它们。也就是说,而不是这样:

{*} Node.NodeHeight := x;

做这个:

Tree.NodeHeight[Node] := x;

这将自动调整所有节点祖先的缓存高度,这决定了滚动条的范围。

更好的是,根本不要为节点分配高度。相反,处理树的OnMeasureItem事件,树会询问您每个节点的高度。当您toVariableNodeHeight设置了选项时,将触发该事件。

如果您真的坚持跳过树的节点高度管理,那么您需要确保自己处理所有必要的任务。这不仅包括更新NodeHeight字段,还包括节点的TotalHeight字段、其父节点、祖父节点等,直到您设置了隐藏根节点的总高度。详情请参阅TBaseVirtualTree.AdjustTotalHeight。它具有私有可见性,因此您不能自己调用​​它。

OnMeasureItem只会为一个节点调用一次。如果由于节点的内容已更改而需要再次调用它,并且需要树重新测量高度,则调用ReinitNode. 如果您正在使用TCustomVirtualStringTree,您也可以调用InvalidateNode

于 2011-07-12T03:46:31.293 回答