52 Stimmen

Was ist der Unterschied zwischen Width und ActualWidth in WPF?

Ich arbeite derzeit mit Panel s in WPF, und ich habe festgestellt, dass in Bezug auf die Width y Height Eigenschaften gibt es noch zwei weitere Eigenschaften namens ActualWidth y ActualHeight .

ActualWidth

Ermittelt die gerenderte Breite dieser Elements. Dies ist eine Abhängigkeits Eigenschaft. (Geerbt von FrameworkElement.)

Width

Liest oder setzt die Breite des Elements. Dies ist eine Abhängigkeitseigenschaft. (Geerbt von FrameworkElement.)

_Referenz: MSDN_

Kann jemand auf Folgendes hinweisen die Unterschiede zwischen den beiden und wann sollte man sie verwenden?

79voto

Muad'Dib Punkte 27506

Width / Height ist die gewünscht oder Layout Größe. Wenn Sie Auto einstellen, ist der Wert double.NaN wenn Sie im nachfolgenden Code auf die Eigenschaft zugreifen.

ActualWidth / ActualHeight y RenderSize.Width / RenderSize.Height geben beide die gerenderte Größe des Elements zurück, da RenderSize ist vom Typ Größe . Wenn Sie die tatsächliche Größe des Artikels wünschen/benötigen, verwenden Sie eines dieser Attribute.

8 Stimmen

Es handelt sich um die Layoutgröße und nicht um die gerenderte Größe.

2 Stimmen

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

2 Stimmen

@dumbledad .RenderSize.Width

11voto

Simon_Weaver Punkte 129442

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 Schaltflächen nebeneinander angeordnet und einen Kommentar darunter, der auf die Breite des StackPanels beschränkt ist, das die beiden Schaltflächen enthält.

<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>

7voto

TWood Punkte 2533

ActualWidth berücksichtigt die Auffüllung des Wertes, so dass Sie diese Zahl jederzeit abrufen können, wenn Sie sie benötigen Actualwidth anstelle von width und vermeiden Sie die Berechnung.

edit: Margin wurde entfernt, da es nicht Teil von ActualWidth ist.

3voto

Andy Mikula Punkte 16650

ActualWidth wird vom Rendering-System festgelegt und kann je nach den Breiten anderer Elemente und den allgemeinen Größenbeschränkungen unterschiedlich sein. Daher kann sie nicht geändert werden. Width ist eine Eigenschaft, die geändert werden kann und verwendet werden sollte, um die Breite des Elements zu vergrößern oder zu verkleinern.

En MSDN :

Diese Eigenschaft ist ein berechneter Wert, der auf anderen Breitenangaben und dem Layoutsystem basiert. Der Wert wird vom Layoutsystem selbst festgelegt, basierend auf einem tatsächlichen Rendering-Durchgang, und kann daher leicht hinter dem festgelegten Wert von Eigenschaften wie Width die die Grundlage für die Eingabeänderung bilden.

3voto

Pascal Punkte 2106

Dafür gibt es einen sehr guten Grund nicht zu verwenden ActualWidth zu binden (offensichtlich ActualHeight entsprechend). Wenn Sie die Width eines Elements, zum ActualWidth eines anderen können Sie die Layout-Kette unterbrechen .

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

Ich hatte zum Beispiel ein Steuerelement, dessen Größeneigenschaft in einem Stil überschrieben wurde, der es auf den Wert TemplatedParent (nicht tun) :

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

Wenn die Größe des Fensters, das es enthält, geändert wird, verhindert das Steuerelement, dass der Container kleiner wird und bremst das Layout. Die Einstellung auf den Width wird das Problem lösen (do) :

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

Wenn Sie die ActualWidth im Allgemeinen ist etwas mit Ihrer Xaml falsch. Besser beheben, dass statt durcheinander mit den endgültigen Größen des Layouts laufen.

1 Stimmen

Ihre Codeschnipsel ("dont do" und "do") sind exakt identisch?!?!

0 Stimmen

Danke für den Kommentar. Ich habe das korrigiert.

2 Stimmen

@tuner Ich stimme dem nicht zu: "Wenn Sie die ActualWidth im Allgemeinen verwenden müssen, stimmt etwas mit Ihrem Xaml nicht". Es ist nichts falsch an der Bindung an ActualWidth (oder ActualHeight ), und in bestimmten Fällen kann dies in der Tat der einfachste Weg sein, ein bestimmtes Layout-Problem zu lösen. Nur weil die Bindung an diese Eigenschaften in (seltenen) Fällen Probleme verursacht, ist dies kein Grund, sie vollständig zu vermeiden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X