2010-09-07 7 views
10

Ich habe festgestellt, dass Android, WPF und Silverlight alle einem Layout-Muster mit zwei Durchgängen folgen. Es gibt eine rekursive Measure() -Methode, die aufgerufen wird, um das Element möglicherweise mehrmals zu skalieren. Dann wird eine rekursive Layout/Arrange() -Methode aufgerufen, die die genauen Positionen der untergeordneten Elemente in ihrer übergeordneten Steuerung festlegt und außerdem die endgültige Größe des Steuerelements festlegt.Zwei-Pass-UI-Layout: Warum?

Meine Frage: Warum ist das in zwei Durchgänge aufgeteilt, vor allem, wenn für einige Arten von Steuerelementen Measure() nicht die tatsächliche Größe eines Steuerelements berechnen kann, ohne die Positionen der Kinder tatsächlich zu legen? Gibt es eine Art von Layout-Minderheit, die dadurch ermöglicht wird?

Ich versuche, meine eigene UI-Toolkit zu erstellen, und ich bin derzeit auf ein One-Pass-Layout() Muster gelehnt, aber ich möchte überzeugt werden, ob das weise oder nicht ist.

Dank dieses für das Lese :)

Sean

Antwort

12

Der Grund für die zwei Durchgänge ist, dass jedes Element in der Struktur den noch verfügbaren Raum des anderen beeinflussen kann.

Einige Elemente möchten den größtmöglichen Platz einnehmen, während andere feste Abmessungen haben. Sie können auch Elemente mit einer maximalen Breite festlegen. Es erstellt eine Gleichung, die nicht in einem Durchgang gelöst werden kann.

Die verschiedenen Paneele in der Hierarchie fragen die Elemente nach der Größe, die sie im ersten Durchgang benötigen, verteilen dann den Abstand zwischen ihnen entsprechend der Natur jedes Paneels und informieren schließlich jedes Element über seinen zugewiesenen Platz.

EDIT: Einige weitere Erklärungen

Der Hauptnachteil einem einzigen Durchlauf-Layout ist, dass Sie jedes Element nacheinander umgehen. Ein erstes Element braucht einen gewissen Platz und die anderen nehmen den Rest. Warum ist dieses Element das erste? Versuchen Sie Ihren Algorithmus mit einer anderen Reihenfolge, und Sie erhalten unterschiedliche Layouts.

Ein Layout mit zwei Durchgängen simuliert ein paralleles Verhalten, bei dem jedes Element das gesamte Layout beeinflusst.

+0

Es ist das letzte Bit, "schließlich informiert jedes Element seines zugewiesenen Speicherplatzes", das ist der wichtige Teil. Der Widget-Manager lässt die Größe der Steuerelemente nicht zu, sondern lässt sie nur Hinweise geben. – moswald

+0

Hmm .. Ich bekomme, wie Kinder über die Größe gierig sein können, die ihnen zugeteilt wird, und dann ist es an den Eltern, die richtige Menge an Speicherplatz zu verteilen. Sie können dies jedoch in einem Single-Pass-Algorithmus erreichen, indem Sie für jedes Kind ein measure() und anschließend für jedes Kind ein endgültiges Layout() erstellen, das sich alle unter dem Aufruf layout() des Elternteils befindet. Dies wäre immer noch eine einzelne Rekursion des Baumes, aber mit zwei Durchgängen für jede Gruppe von Kindern. Habe ich recht, wenn ich bedenke, dass damit das gleiche Ziel erreicht wird wie mit dem Two-Pass-Ansatz, aber weniger effizient? – Sean

+0

Aus der Perspektive des Großelterns ist der Elternteil nur ein weiteres Kind, das er messen möchte() und das Layout(). ;) – Bubblewrap