Flex 如何将 setStyle 延迟到下一次更新?
Posted
技术标签:
【中文标题】Flex 如何将 setStyle 延迟到下一次更新?【英文标题】:Flex How to delay setStyle until next update? 【发布时间】:2010-10-29 03:15:10 【问题描述】:我有一个由两部分组成的组件,假设一个 Vbox 中有两个 Hbox A 和 B。
在特定通话中我想:
- Hide B with B.visible = false
- setStyle("borderSkin", FooBorderOn);
问题是在调整父 Vbox 的大小之前绘制边框, 所以我最终在 Vbox 周围有一个边框,B 不可见:
.....................
. A .
. .
. .
. .
. BLANK SPACE .
.....................
我希望边框围绕 vbox 的下一个更新大小。 有没有类似 "do that afer redraw" ? 在 flex 中?
非常感谢
【问题讨论】:
奇怪的是,即使使用 callLater 空白区域仍然存在,但是如果我再次调用 skinBorder 样式形成一个单独的按钮事件,它将仅使用 A 在 Vbox 周围很好地绘制。设置 B 可见 false 需要比一帧更长的时间吗? 啊。我现在看到你的问题了。将可见设置为 false 不会更改布局。不可见的组件仍然会占用布局中的空间。你需要做的也是设置 B.includeInLayout = false; 【参考方案1】:有几种方法可以推迟操作。如果您自己开发 UI 组件,请查看 invalidateProperties / commitProperties。这是一种不会陷入更新循环的机制:您标记要更新的属性(通常通过将其存储在临时变量中和/或添加 xxxChanged 布尔值)并调用 invalidateProperties()。 Flex 稍后会调用 commitProperties() - 累积几个可能相互影响的更改 - 您可以在其中进行实际更改。
callLater 也是一种选择,尽管通常它不像人们想象的那样“稍后”:) (这是下一次屏幕刷新,可能很快就会发生,甚至在其他排队操作之前)
但是,就您而言,根据您的描述,我认为您只是错过了“includeInLayout”属性。容器将根据这两个单独的属性决定为对象显示(可见)或腾出空间(includeInLayout)。另见Preventing layout of hidden controls。
【讨论】:
【参考方案2】:即使隐藏了 VBox,HBox B 仍然存在。我会缩小 VBox 的高度,将 VerticalScrollPolicy 设置为 false(这样滚动条就不会显示),或者只是从 VBox 中删除 HBox(myVBox.removeChild () )。
【讨论】:
【参考方案3】:那是 callLater ... 我记得在某个地方
【讨论】:
【参考方案4】:看一下 callLater 方法。这会将方法调用推迟到下一帧更新。
【讨论】:
以上是关于Flex 如何将 setStyle 延迟到下一次更新?的主要内容,如果未能解决你的问题,请参考以下文章
我们如何导航到一个网页,抓取数据,移动到下一页,然后再做一次?
NodeJS,如何强制异步 for 循环在传递到下一次迭代之前等待 HTTP 请求解决,这样我们就不会收到 EMFILE 错误?