如果每个节点高度更改为不同的高度,如何刷新VirtualStringTree
的滚动条。因为,滚动仍处于相同状态,导致滚动时无法查看其他节点。
toVariableNodeHeight
选项不起作用?还有其他想法吗?
答案 0 :(得分:3)
有些东西告诉我,当你说“每个NodeHeight都被更改了”时,你的意思是说你直接将新值分配给每个节点记录的NodeHeight
字段。首先,不要这样做。如果必须为节点指定高度,请通过树的NodeHeight
属性进行分配。也就是说,而不是:
{*} Node.NodeHeight := x;
这样做:
Tree.NodeHeight[Node] := x;
这将自动调整所有节点祖先的缓存高度,这是决定滚动条范围的原因。
更好的是,根本不要为节点分配高度。相反,处理树的OnMeasureItem
事件,树会询问每个节点的高度。如果设置了toVariableNodeHeight
选项,则会触发该事件。
如果您真的坚持跳过树的节点高度管理,那么您需要确保自己处理所有所需的任务。这包括不仅更新NodeHeight
字段,还更新节点的TotalHeight
字段,其父节点,祖父节点等,直到您设置隐藏根节点的总高度为止。有关详细信息,请参阅TBaseVirtualTree.AdjustTotalHeight
。它具有私人可见性,因此您无法自己调用它。
OnMeasureItem
只会为一个节点调用一次。如果您需要再次调用它,因为节点的内容已更改,您需要树重新测量高度,请调用ReinitNode
。如果您使用的是TCustomVirtualStringTree
,则还可以拨打InvalidateNode
。