2009-05-26 2 views
1

У меня есть компонент, состоящий из двух частей, скажем, двух Hbox A и B в Vbox.Flex Как задержать setStyle до следующего обновления?

На определенном вызове я хочу:

- Hide B with B.visible = false 
- setStyle("borderSkin", FooBorderOn); 

Проблема заключается в том, что граница втянуться до изменения размера родительского VBOX произойдет, , так что я в конечном итоге с обрамлением VBOX с B невидимым :

..................... 
.   A   . 
.     . 
.     . 
.     . 
.  BLANK SPACE . 
..................... 

Я хотел бы, чтобы граница с et вокруг следующего обновленного размера vbox. Есть ли что-то вроде «сделать это афер перерисовать»? в flex?

Большое спасибо

+0

Странно даже с callLater это пустое место все еще там, однако, если я снова вызову syleBorder syle из отдельного события кнопки, он будет хорошо рисовать вокруг Vbox только с A. Является ли настройка B видимой ложью, занимает больше времени, чем кадр? – coulix

+0

Ahh. Я вижу вашу проблему сейчас. Установка видимости на false не изменит макет. Невидимый компонент по-прежнему будет занимать место в макете. То, что вам нужно сделать, также установлено B.includeInLayout = false; –

ответ

2

Посмотрите на метод callLater. Это отложит вызов метода до следующего обновления кадра.

0

Это было callLater ... Я имел это в моей памяти где-то

0

Даже если вы скрыть VBox, HBox B все еще там. Я бы сжимал высоту VBox, устанавливал VerticalScrollPolicy на false (так, чтобы полоса прокрутки не показывалась), или просто удалили HBox из VBox (myVBox.removeChild()).

0

Существует несколько способов отложить действия. Если вы разрабатываете компонент пользовательского интерфейса самостоятельно, взгляните на invalidateProperties/commitProperties. Это механизм, который не застревает в циклах обновления: вы отмечаете свойство, которое нужно обновить (обычно, сохраняя его в temp var и/или добавляя xxxChanged Boolean) и вызывайте invalidateProperties(). Затем Flex вызовет commitProperties() немного позже - скопировав несколько изменений, которые могут повлиять друг на друга, - где вы можете сделать свое фактическое изменение.

callLater будет также вариант, хотя обычно это не так «позже», как можно было бы подумать :) (Это следующий экран обновления, который может произойти довольно скоро, еще до других очереди действий)

Однако в вашем случае, из вашего описания, я думаю, вы просто пропустили свойство includeInLayout. Контейнеры решат отображать (видны) или освобождать место (includeInLayout) для объектов на основе этих двух отдельных свойств. См. Также Preventing layout of hidden controls.

Смежные вопросы