Frage

Ich arbeite derzeit mit Panels 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?

War es hilfreich?

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top