2009-08-04 11 views

Antwort

4

Es gibt zwei Durchgänge im Layoutsystem - messen und anordnen.

Zuerst in der Maßnahme Pass jedes Kind ist eine vorgeschlagene verfügbare Größe gegeben, und dies propagiert den Baum hinunter. Dies legt die Eigenschaft DesiredSize jedes Kindes fest.

In der nächsten, Arrange-Pass, wird die DesiredSize berücksichtigt, aber das Elternteil hat das letzte Wort darüber, wie viel tatsächliche verfügbare Größe es einem Kind geben wird, und die Eltern legt jedes Kind entsprechend, informiert es tatsächliche Größe wird es, und so weiter den Baum hinunter.

Auch mehrere erdenkliche Ecke Fälle betrachten:

  • Das Kind verlangt double.Infinity gewünschte Größe: ausdrücklich nicht erlaubt, löst eine Ausnahme
  • Das Kind seinen HorizontalAlignment setzt auf „Stretch“: die Eltern nicht bietet unendliche tatsächliche Größe
  • Fenster auf SizeToConent, Kind auf „Stretch“, keine andere Einschränkung gesetzt:
    1. Fenster bieten erstes unendliche Maß Größe
      • Kind die Größe von ihren Kindern (Textbreite, Ränder, etc.) gemessen verlangt - nicht unendlich Größe
      • Ordnen: Fenster setzt auf ein systemdefinierte Minimum seine Größe oder nach Wunsch von Kind, je nachdem, was größer ist (kann nicht unendlich sein)
      • Das Kind streckt die Größe in vorherigem Schritt
+0

Schön erklärt. – Stimul8d

+0

Ja, danke. Für andere habe ich http://msdn.microsoft.com/en-us/library/ms745058.aspx gelesen und Refactor verwendet, um den tatsächlichen WPF-Code zu betrachten. – subb

+0

'Willkommen. Du meinst * Reflektor *, oder? :) –

1

Es ist nicht so schwierig: Wenn das Fenster so eingestellt ist, dass es an seinen Inhalt angepasst wird, hat es keine statische Größe und nimmt daher Standardmaße an. Wenn Sie den visuellen Baum herunterfahren, möchte das Steuerelement das Fenster ausfüllen, um es zu füllen. Es erzwingt keine Dimensionen, sondern akzeptiert die Größe des Fensters (die Standardgröße).

Meine Vermutung ist, dass Elemente immer eine Größe haben (Standard ist, wenn keine über ihnen in der Hierarchie angegeben) und die Erwähnung, ob diese Größe fest oder verhandelbar ist.

Ich rate nur hier, aber es ist nur um zu beweisen, dass die Situation nicht so schlimm ist, wie es scheint. Mit einer guten Update-Strategie können die Elemente in einer vernünftigen Weise in Bezug aufeinander eingestellt werden.

+0

Ok bestimmt passen. Ich habe gerade einen weiteren Test mit einer Textbox gemacht. Wenn ich Text hinzufüge, dehnt sich das Fenster aus, um den Inhalt aufzunehmen. Der Inhalt zwingt also eine Dimension. Was passiert in diesem Fall? – subb

+0

Was kann passieren, ist, dass die TextBox die Größe ändern darf, und das Fenster ist so eingestellt, dass dies erlaubt. In diesem Fall gibt es keine Schleife mehr, da die TextBox einige Dimensionen hat, die sie erhalten möchte, nämlich die Größe des Inhalts - nicht mehr mit der Größe des Fensters verbunden. Die Änderung in den Dimensionen schreitet den visuellen Baum hinauf, und das Fenster ist auch dazu bereit, durch die Größenänderung zu arbeiten. Dies bewirkt nicht, dass die Größe der TextBox erneut geändert wird. –