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 延迟到下一次更新?的主要内容,如果未能解决你的问题,请参考以下文章

如何在循环中回滚到下一次迭代?

我们如何导航到一个网页,抓取数据,移动到下一页,然后再做一次?

WPF Avalondock 将布局保存到下一次启动

NodeJS,如何强制异步 for 循环在传递到下一次迭代之前等待 HTTP 请求解决,这样我们就不会收到 EMFILE 错误?

Actionscript 3 setStyle 不是一个函数

如何将微调器值发送到下一页?