2008-10-28 3 views
7

Ich habe dieses Problem seit fast einem Jahr mit Flex erlebt und jedes Mal arbeite ich an einer schnellen Lösung, die vorerst funktioniert. Ich würde gerne sehen, ob jemand eine bessere Idee hat.Die beste Methode zur Größenanpassung von Containern in Flex, um den expliziten Dimensionen der übergeordneten Container zu entsprechen

Hier sind die Bedingungen eines Problems:

|------Container ------------| 
| explicitHeight: 400 (or whatever) 
|        | 
| |-------- VBox -------| | 
| | percentHeight: 100 | | 
| |      | | 
| | |-Repeater------| | | 
| | | Potentially | | | 
| | | a lot of stuff. | | 
|--|--|---------------|---|---| 

Das Problem ist, dass, im Gegensatz zu dem, was ich die VBox passieren möchte, wird immer der Inhalt darin aufzunehmen erweitern, anstatt auf die von kleben explizite Höhe des übergeordneten Elements und Erstellen einer Bildlaufleiste.

Meine Lösung bestand darin, einen Verweis auf den übergeordneten Code fest zu codieren (oder wie weit die Anzeigeliste auch sein muss, um einen explizit gesetzten Wert im Gegensatz zu einem Prozentsatz zu finden).

habe ich auch mit diesem in einer Utility-Klasse betrachtet:

public static function getFirstExplicitHeightInDisplayList(comp:UIComponent):Number{ 
    if (!isNaN(comp.explicitHeight)) return comp.explicitHeight; 
    if (comp.parent is UIComponent) return  
     getFirstExplicitHeightInDisplayList(UIComponent(comp.parent)); 
    else return 0; 
} 

Bitte sagen Sie mir, es gibt einen besseren Weg.

Antwort

8

Sie haben die „autolayout“ Parameter auf dem VBox zu verwenden, wie Dokumentation sagen:.

„standardmäßig die Größe der VBox-Container groß genug ist, um das Bild in seiner ursprünglichen Größe zu halten, wenn Sie das Layout deaktivieren Wenn Sie den Zoom-Effekt verwenden, um das Bild zu vergrößern, oder verwenden Sie den Move-Effekt, um das Bild neu zu positionieren, könnte das Bild über die Grenzen des VBox-Containers hinausreichen
Sie legen die AutoLayout-Eigenschaft auf false fest, also die VBox Der Container ändert seine Größe nicht, wenn die Größe des Bildes geändert wird.Wenn das Bild auf eine Größe wächst, die über die Grenzen des VBox-Containers hinausreicht, fügt der Container Bildlaufleisten und Clips hinzu Bild an seinen Grenzen.

Ich hoffe, dass dir das weiterhilft.

+0

Es tut! Danke für die Antwort. – Aaron

1

Legen Sie die Eigenschaften des Containers:

clipContent = true; 
verticalScrollPolicy = "off" 

Dann wird Ihr VBox automatisch Clip, wenn es percentHeight = 100 hat;

Works für mich in Flex 3.

Wenn Sie wirklich Lust bekommen, dann können Sie das scrollRect auf Objekte festgelegt:

scrollRect = new Rectangle(x, y, w, h); 

je nachdem, was Sie es tun müssen.

13

Einstellung minHeight = 0 ist alles was Sie tun müssen.

Das weist die VBox an, die Maße der Kinder zu ignorieren, wenn sie sich selbst dimensioniert, und berechnet stattdessen ihre Höhe basierend auf ihren eigenen/ihren Elternbeschränkungen. Stellen Sie alles anders ein, als Sie normalerweise würden, Scrollen und alles andere wird perfekt funktionieren.

verbrachte Tage vor einem Jahr hier - es ist nicht intuitiv, sie hätten wahrscheinlich die Eigenschaft besser genannt. Hoffe, das spart euch einige Zeit ...

+3

Noch ein weiterer Fall, in dem Flex keinen Sinn ergibt. Ich bin geneigt, nur eine Liste dieser Dinge zu führen ... – Aaron

+0

Ich schulde dir ein Getränk deiner Wahl, wenn wir uns jemals treffen. –

2

AutoLayout = false scheint nur zu verhindern, dass das Layout erneut ausgeführt wird, wenn sich die Werte der Kinder Größe ändern. Wenn Sie jedoch untergeordnete Elemente hinzufügen oder entfernen, wird das Layout trotzdem erneut ausgeführt.

Einstellung minHeight = 0 trennt tatsächlich die (äußere) Größe der VBox vollständig von der Größe und Anzahl der Kinder, was ich wollte.

Durch den Flex-Quellcode schleichen Ich habe den Mechanismus nicht gesehen, durch den die Einstellung von minHeight = 0 so funktioniert, wie ich es wollte, also grüße ich Yarin, um es zu entdecken. Vielen Dank!

0

In der Tat, Yarin Kessler brachte uns die einzige richtige Antwort hier (leider habe ich nicht die Rechte, seinen Beitrag zu kommentieren, deshalb mache ich es hier).

Wenn Ihre HBox-Bemaßung auf einem Prozentwert basiert, hoffen Sie, dass nur ihr Container seine Größe beeinflusst. Das ist falsch, es gibt eine andere Regel, eine stärkere. Es ist die Tatsache, dass ein Container (der HBox ist) eine minimale Größe hat, die die Standardgrößen/explizite Größe seiner eigenen Childs-Komponenten ist.

Wenn also Ihr Prozentwert zu einem Wert führt, der kleiner als die Mindestgröße ist, wird die Minimalgröße gewonnen und auf die HBox angewendet. Da die HBox alle untergeordneten Elemente anzeigt, sind keine Bildlaufleisten erforderlich.

So verwenden:

minHeight = 0; 
minWidth = 0; 

ist auf die HBox wie zu sagen, dass seine minimale Größe ist 0 statt seiner Kinder Standardgrößen. Sie definieren es neu und auf diese Weise ist die minimale Größe kleiner als der Prozentwert und verliert den Kampf.

Der einzige Satz, den ich in Adobe Dokumentation dieser Erklärung ist diese:

Eine bestimmte Prozentsatz basierende Behältergröße Beratungs ist. Flex macht den Behälter groß genug, um seine Kinder in ihrer kleinsten Größe zu halten.

Hoffnung ich mich klar gemacht,

(fühlen Sie sich frei, meine falschen Englisch Sätze ... zu korrigieren)

Verwandte Themen