2009-05-26 5 views
1

Ich habe eine Komponente aus zwei Teilen, sagen wir zwei Hbox A und B in einer Vbox.Flex Wie verzögert man setStyle bis zum nächsten Update?

An einem bestimmten Anruf mag ich:

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

Das Problem ist, dass die Grenze gezogen, bevor die Redimensionierung der Mutter Vbox passieren, so habe ich am Ende mit einem Rahmen um den Vbox mit unsichtbaren B :

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

Ich möchte die Grenze zu et um die nächste aktualisierte Größe der Vbox. Gibt es so etwas wie "Do not after redraw"? im flex?

Vielen Dank

+0

Seltsamerweise sogar mit callLater es ist der leere Raum immer noch da, aber wenn ich wieder den skinBorder syle Form ein separates Button-Ereignis, wird es gut um die Vbox nur mit A zeichnen. Ist die Einstellung B sichtbar falsch dauert länger als ein Frame? – coulix

+0

Ahh. Ich sehe dein Problem jetzt. Wenn Sie "Sichtbar" auf "Falsch" setzen, wird das Layout nicht geändert. Die unsichtbare Komponente nimmt noch Platz im Layout ein. Was Sie tun müssen, ist auch gesetzt B.includeInLayout = false; –

Antwort

2

Werfen Sie einen Blick auf die calllater Methode. Dies verschiebt einen Methodenaufruf bis zum nächsten Frame-Update.

0

Es war calllater ... Ich kann es in meinem Gedächtnis

irgendwo hatte es
0

Auch wenn Sie die VBox, verstecken HBox B ist nach wie vor. Ich würde die Höhe der VBox verkleinern, die VerticalScrollPolicy auf false setzen (damit die Bildlaufleiste nicht angezeigt wird) oder einfach nur die HBox aus der VBox entfernen (myVBox.removeChild()).

0

Es gibt mehrere Möglichkeiten, Aktionen zu verschieben. Wenn Sie selbst eine UI-Komponente entwickeln, werfen Sie einen Blick auf invalidateProperties/commitProperties. Dies ist ein Mechanismus, um nicht in Update-Schleifen steckenzubleiben: Sie markieren eine Eigenschaft, die aktualisiert werden soll (normalerweise durch Speichern in einer temporären Variablen und/oder Hinzufügen eines booleschen xxxChanged-Objekts) und rufen invalidateProperties() auf. Flex wird dann commitProperties() ein wenig später aufrufen - mehrere Änderungen sammeln, die sich gegenseitig beeinflussen können - wo Sie Ihre tatsächlichen Änderungen vornehmen können.

callLater wäre auch eine Option sein, wenn auch in der Regel ist es nicht so „später“, wie man denken würde :) (Es ist der nächste Bildschirm zu aktualisieren, die recht bald passieren könnten, noch bevor andere Warteschlangen Aktionen)

jedoch In Ihrem Fall, von Ihrer Beschreibung, glaube ich, dass Sie gerade die Eigenschaft "includeInLayout" vermisst haben. Container werden entscheiden, Objekte für diese beiden separaten Eigenschaften anzuzeigen (sichtbar) oder Platz zu machen (includeInLayout). Siehe auch Preventing layout of hidden controls.