¿Cuál es la diferencia entre Width y ActualWidth en WPF?
size (7)
Encuentro ActualWidth
más útil cuando quiero vincular el ancho o alto de un elemento a otro.
En este sencillo ejemplo, tengo dos botones dispuestos uno al lado del otro y un comentario debajo que está restringido al ancho del StackPanel que contiene los dos botones.
<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>
Actualmente estoy trabajando con Panel
s en WPF, y noté que en cuanto a las propiedades Width
y Height
, también hay otras dos propiedades llamadas ActualWidth
y ActualHeight
.
ActualWidth
Obtiene el ancho representado de este elemento. Es una propiedad de dependencia. (Heredado de FrameworkElement).
Width
Obtiene o establece el ancho del elemento. Es una propiedad de dependencia. (Heredado de FrameworkElement).
Referencia: MSDN
¿Alguien puede señalar las diferencias entre los dos y cuándo usar uno?
Es exactamente eso, el ancho de renderizado! = Ancho de diseño. Uno está destinado a ser utilizado para el diseño, el otro está destinado para el procesamiento. Al igual que con WinForms, había una propiedad Size y ClientSize, la diferencia es leve y debe usar el tamaño Atual / Client de la representación y la anchura / altura para el diseño.
Hay una muy buena razón para no usar el ActualWidth
para enlazar (obviamente con ActualHeight
). Cuando establece el Width
de un elemento, al ActualWidth
de otro, puede romper la cadena de diseño .
En el mejor de los casos, su elemento / control debe analizarse una vez finalizado el proceso de diseño del elemento principal (el origen de enlace). Eso significa tiempo adicional. Si está en el mismo nivel de jerarquía que el elemento primario, el proceso de diseño necesita dos ejecuciones (al menos) para calcular un tamaño definitivo.
Por ejemplo, tenía un control que tenía su propiedad de tamaño anulada en un estilo que lo configuraría en TemplatedParent
(no lo haga) :
<Rectangle DockPanel.Dock="Top" Width="{TemplateBinding ActualWidth}"
Height="1" Fill="#000000"/>
Al redimensionar la ventana contenedora, el control evitaría que el contenedor se hiciera más pequeño y frenaría el diseño. Configurarlo en el Width
resolverá el problema (hacer) :
<Rectangle DockPanel.Dock="Top" Width="{TemplateBinding Width}"
Height="1" Fill="#000000"/>
Si tiene que usar el ActualWidth
en general algo está mal con su xaml. Es mejor arreglar eso en lugar de estropear los tamaños finales de la ejecución del diseño.
Puede establecer la propiedad Width
, pero no la propiedad ActualWidth
.
La propiedad Width
se usa para determinar cómo se representa el panel, luego el ActualWidth
se establece en el ancho real que se utilizó. Puede que no tenga el mismo valor que Ancho, según el tamaño de los elementos secundarios y las restricciones de su elemento principal.
El ActualWidth
no se establece de inmediato al configurar la propiedad Width
, pero se actualizará (una o más veces) durante el procesamiento.
ActualWidth
cuenta el relleno en el valor, por lo que cada vez que necesite saber ese número, puede llamar a Actualwidth
lugar de a ancho y evitar el cálculo.
edit: eliminado Margin b / c no es parte de ActualWidth.
ActualWidth
es establecido por el sistema de renderizado, y puede ser diferente dependiendo del ancho de otros elementos y restricciones de tamaño general. Como resultado, no puede ser cambiado. Width
es una propiedad que se puede cambiar y se debe usar para aumentar o disminuir el ancho del elemento.
Desde MSDN :
Esta propiedad es un valor calculado basado en otras entradas de ancho, y el sistema de diseño. El valor es establecido por el propio sistema de disposición, basado en un pase de renderizado real, y por lo tanto puede retrasarse ligeramente por debajo del valor establecido de propiedades tales como
Width
que son la base del cambio de entrada.
Width
/ Height
es el tamaño solicitado o de diseño . Si configura en Automático, entonces el valor es double.NaN
cuando accede a la propiedad en el código subyacente.
ActualWidth
/ ActualHeight
es el tamaño representado . Si quiere / necesita el tamaño real del artículo, entonces use este atributo.