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