2009-03-03 7 views
42

Ich arbeite derzeit mit Panel s in WPF, und ich bemerkte, dass in Bezug auf die Width und Height Eigenschaften, gibt es auch zwei andere Eigenschaften namens ActualWidth und ActualHeight.Was ist der Unterschied zwischen Breite und ActualWidth in WPF?

ActualWidth

Ruft die gerenderte Breite dieses Elements. Dies ist eine Abhängigkeit Eigentum. (Geerbt von Framework.)

Width

Ruft die Breite des Elements. Dies ist eine Abhängigkeitseigenschaft. (Geerbt von Framework.)

Referenz: MSDN

jemand die Unterschiede zwischen den beiden darauf hinweisen kann und wenn einer bedienen?

Antwort

62

Width/Height ist die angefordert oder Layout Größe. Wenn Sie auf Automatisch setzen, lautet der Wert double.NaN, wenn Sie auf die Eigenschaft im Code dahinter zugreifen.

ActualWidth/ActualHeight ist die gerendert Größe. Wenn Sie die tatsächliche Größe des Artikels benötigen/benötigen, verwenden Sie dieses Attribut.

+7

Es ist eigentlich die Layoutgröße nicht die gerenderte Größe. – chuckj

+2

@chuckj, welches Attribut würde man verwenden, um die gerenderte Größe zu erhalten? – dumbledad

+0

@dumbledad '.RenderSize.Width' – Mafii

3

ActualWidth wird vom Rendering-System festgelegt und kann abhängig von der Breite anderer Elemente und der Gesamtgrößenbeschränkung abweichen. Daher kann es nicht geändert werden. Width ist eine Eigenschaft, die geändert werden kann, und sollte verwendet werden, um die Breite des Elements zu erhöhen oder zu verringern.

Von MSDN:

Diese Eigenschaft ist ein berechneter Wert auf der Grundlage anderer Breite Eingaben und das Layoutsystem. Der Wert wird vom Layout-System selbst basierend auf einem tatsächlichen Rendering-Durchlauf festgelegt und kann daher geringfügig hinter dem festgelegten Wert von Eigenschaften wie Width zurückbleiben, die die Grundlage für die Eingabeänderung sind.

0

Es ist genau das, die Renderbreite! = Layoutbreite. Eines soll für das Layout verwendet werden, das andere soll zum Rendern dienen. Wie bei WinForms gab es eine Size- und eine ClientSize-Eigenschaft, die sich leicht unterscheiden und Sie sollten die Amal/Client-Größe des Renderings und die Breite/Höhe für das Layout verwenden.

0

Sie können die Width-Eigenschaft festlegen, nicht jedoch die ActualWidth-Eigenschaft.

Die Width Eigenschaft wird verwendet, um zu bestimmen, wie das Panel gerendert wird, dann wird ActualWidth auf die tatsächlich verwendete Breite gesetzt. Dies ist möglicherweise nicht derselbe Wert wie die Breite, abhängig von der Größe der untergeordneten Elemente und den Einschränkungen des übergeordneten Elements.

Die ActualWidth wird nicht sofort beim Festlegen der Width-Eigenschaft festgelegt, aber während des Renderns (ein- oder mehrmals) aktualisiert.

7

ActualWidth Accounts für die Auffüllung im Wert, so dass Sie jederzeit, wenn Sie diese Nummer wissen müssen Actualwidth statt Breite und vermeiden Sie die Berechnung.

bearbeiten: entfernt Rand b/c ist nicht Teil von ActualWidth.

10

Ich finde ActualWidth am nützlichsten, wenn ich die Breite oder Höhe eines Elements an ein anderes binden möchte.

In diesem einfachen Beispiel habe ich zwei Tasten nebeneinander angeordnet und einen Kommentar darunter, der auf die Breite des StackPanel mit den zwei Tasten beschränkt ist.

<StackPanel> 

    <StackPanel Margin="0,12,0,0" Orientation="Horizontal" Name="buttonPanel" HorizontalAlignment="Left" > 
     <Button Content="Yes - Arm the missile" FontWeight="Bold" HorizontalAlignment="Left"/> 
     <Button Content="No - Save the world" HorizontalAlignment="Left" Margin="7,0,0,0"/> 
    </StackPanel> 

    <TextBlock Text="Please choose whether you want to arm the missile and kill everybody, or save the world by deactivating the missile." 
       Width="{Binding Path=ActualWidth,ElementName=buttonPanel}" Margin="0,5,0,0" HorizontalAlignment="Left" TextWrapping="Wrap"/> 

</StackPanel> 
3

Es gibt einen sehr guten Grund nicht die ActualWidth zu verwenden, um (natürlich ActualHeight entsprechend) zu binden. Wenn Sie die Width eines Elements auf die ActualWidth eines anderen setzen, können Sie die Layout-Kette brechen.

Im besten Fall muss Ihr Element/Steuerelement analysiert werden, nachdem der Layoutprozess des übergeordneten Elements (der Bindungsquelle) beendet wurde. Das bedeutet zusätzliche Zeit. Wenn es sich auf der gleichen Hierarchieebene wie das übergeordnete Element befindet, benötigt der Layoutprozess mindestens zwei Durchläufe, um eine endgültige Größe zu berechnen.

Zum Beispiel hatte ich eine Steuerung, die in einem Stil überschrieben es Leimeigenschaft hatte, dass es in die TemplatedParent(nicht tun) gesetzt würde:

<Rectangle DockPanel.Dock="Top" Width="{TemplateBinding ActualWidth}" 
      Height="1" Fill="#000000"/> 

Wenn Ändern der Größe der enthält Fenster, die Steuer würde verhindern, dass der Behälter kleiner wird und das Layout bremst. um es in die Width Einstellung wird das Problem (do) lösen:

<Rectangle DockPanel.Dock="Top" Width="{TemplateBinding Width}" 
      Height="1" Fill="#000000"/> 

Wenn Sie mit Ihrem XAML die ActualWidth im Allgemeinen etwas falsch verwenden. Besser beheben, anstatt mit den endgültigen Größen des Layout-Laufs herumzuspielen.

+1

Ihre Code-Schnipsel (" do not do "und" do ") sind genau gleich?!?! – PIntag

+0

Danke für den Kommentar. Das wurde behoben. – Pascal

+1

@Tuner Ich stimme damit nicht überein: "Wenn Sie die ActualWidth im Allgemeinen etwas falsch mit Ihrem XAML verwenden müssen". Es gibt nichts Falsches an der Bindung an 'ActualWidth' (oder' ActualHeight'), tatsächlich kann dies in bestimmten Fällen der einfachste Weg sein, ein bestimmtes Layoutproblem zu lösen. Nur weil die Bindung an diese Eigenschaften Probleme bei (seltenen) Anlässen verursacht, ist dies kein Grund, sie vollständig zu vermeiden. –