Was ist der Unterschied zwischen der Breite und der tatsächlichen Breite in WPF?
-
03-07-2019 - |
Frage
Ich arbeite derzeit mit Panel
s in WPF, und ich bemerkte das in Bezug auf die Width
und Height
Eigenschaften, es werden auch zwei weitere Eigenschaften genannt ActualWidth
und ActualHeight
.
ActualWidth
Erhält die gerenderte Breite dieses Elements. Dies ist eine Abhängigkeitseigenschaft. (Von FrameworkElement geerbt.)
Width
Bekommt oder legt die Breite des Elements fest. Dies ist eine Abhängigkeitseigenschaft. (Von FrameworkElement geerbt.)
Bezug: Msdn
Kann jemand darauf hinweisen Die Unterschiede zwischen den beiden und wann können Sie eines verwenden?
Lösung
Width
/Height
ist der angefordert oder Layout Größe. Wenn Sie auf Auto einstellen, ist der Wert der Wert double.NaN
Wenn Sie auf die Eigenschaft in Code dahinter zugreifen.
ActualWidth
/ActualHeight
ist der gerendert Größe. Wenn Sie die tatsächliche Größe des Elements möchten/benötigen, verwenden Sie dieses Attribut.
Andere Tipps
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 und einen Kommentar darunter, der auf die Breite des Stackpanels mit den beiden 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>
ActualWidth
Berücksichtigt das Polsterung des Wertes, sodass Sie diese Nummer, die Sie anrufen können Actualwidth
anstelle von Breite und vermeiden Sie die Berechnung.
Bearbeiten: Rand entfernt b/c Es ist nicht Teil der tatsächlichen Breite.
ActualWidth
is set by the rendering system, and may be different depending on the widths of other elements and overall size constraints. As a result, it can not be changed. Width
is a property that can be changed, and should be used to increase or decrease the width of the element.
From MSDN:
This property is a calculated value based on other width inputs, and the layout system. The value is set by the layout system itself, based on an actual rendering pass, and may therefore lag slightly behind the set value of properties such as
Width
that are the basis of the input change.
Es gibt einen sehr guten Grund nicht die Verwendung des ActualWidth
an bin (offensichtlich ActualHeight
entsprechend). Wenn Sie die festlegen Width
eines Elements, zum ActualWidth
Von einem anderen May können Sie Brechen Sie die Layoutkette.
Im besten Fall muss Ihr Element/Ihre Steuerung nach Abschluss des Layoutprozesses des übergeordneten (der Bindungsquelle) analysiert werden. Das bedeutet zusätzliche Zeit. Wenn es sich um die gleiche Hierarchieebene wie das Elternteil befindet, benötigt der Layoutprozess zwei Läufe (zumindest), um eine endgültige Größe zu berechnen.
Zum Beispiel hatte ich eine Kontrolle, die ihre Größe in einem Stil überschrieben hatte, der sie auf die festlegen würde TemplatedParent
(nicht tun):
<Rectangle DockPanel.Dock="Top" Width="{TemplateBinding ActualWidth}"
Height="1" Fill="#000000"/>
Bei der Größenänderung des Fensters verhindern die Steuerung, dass der Behälter kleiner wird und das Layout bremst. Setzen Sie es auf die Width
wird das Problem lösen (tun):
<Rectangle DockPanel.Dock="Top" Width="{TemplateBinding Width}"
Height="1" Fill="#000000"/>
Wenn Sie das verwenden müssen ActualWidth
Im Allgemeinen stimmt etwas mit Ihrem XAML nicht. Besser das beheben, anstatt die letzten Größen des Layout -Laufs durcheinander zu bringen.
Genau das ist die Renderbreite! = Layoutbreite. Einer soll für das Layout verwendet werden. Der andere ist zum Rendern vorgesehen. Wie bei WinForms gab es eine Größe und eine Clientiz -Eigenschaft, die sich geringfügig unterscheiden und Sie sollten die Rendergröße für die atuale/Kunden und die Breite/Höhe für das Layout verwenden.
Sie können die festlegen Width
Eigentum, aber nicht das ActualWidth
Eigentum.
Das Width
Eigenschaft wird verwendet, um zu bestimmen, wie das Panel gerendert wird, dann die ActualWidth
ist auf die tatsächliche Breite eingestellt, die verwendet wurde. Dies ist möglicherweise nicht der gleiche Wert wie die Breite, abhängig von der Größe der Kinderelemente und Einschränkungen des übergeordneten Elements.
Das ActualWidth
wird beim Einstellen der nicht sofort eingestellt Width
Eigentum, wird aber während des Renders aktualisiert (ein oder mehrmals).