Pregunta

Actualmente estoy trabajando con Panel s en WPF, y noté que con respecto a las propiedades Width y Height , también hay dos otras propiedades llamadas ActualWidth y ActualHeight .

  

ActualWidth

     

Obtiene el ancho renderizado de este   elemento. Esta es una dependencia   propiedad. (Heredado de   FrameworkElement.)

     

Width

     

Obtiene o establece el ancho del elemento.   Es una propiedad de dependencia.   (Se hereda de FrameworkElement).

Referencia: MSDN

¿Puede alguien señalar las diferencias entre los dos y cuándo usar uno de ellos?

¿Fue útil?

Solución

Width / Height es el tamaño solicitado o diseño . Si establece en Auto, el valor es double.NaN cuando accede a la propiedad en el código detrás.

ActualWidth / ActualHeight es el tamaño renderizado . Si desea / necesita el tamaño real del artículo, use este atributo.

Otros consejos

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 Panel de Pila 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>

ActualWidth da cuenta del relleno en el valor, por lo que siempre que necesite saber ese número, puede llamar a Actualwidth en lugar del ancho y evitar el cálculo.

editar: eliminado Margen b / c no es parte de ActualWidth.

ActualWidth está establecido por el sistema de representación y puede ser diferente según los anchos de otros elementos y las restricciones de tamaño en general. Como resultado, no se puede cambiar. Width es una propiedad que se puede cambiar y se debe usar para aumentar o disminuir el ancho del elemento.

De MSDN :

  

Esta propiedad es un valor calculado basado en otras entradas de ancho y el sistema de diseño. El valor lo establece el propio sistema de diseño, basado en un pase de representación real, y por lo tanto, puede retrasarse ligeramente respecto al valor establecido de propiedades como Width que son la base del cambio de entrada.

Hay una muy buena razón para no usar ActualWidth para enlazar (obviamente, ActualHeight ). Cuando configura 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 después de que finalice el proceso de diseño del elemento primario (la fuente de enlace). Eso significa tiempo adicional. Si se encuentra en el mismo nivel jerárquico que el padre, 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 establecería en TemplatedParent (no hacer) :

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

Al cambiar el tamaño de la ventana que contiene, el control evitaría que el contenedor se haga más pequeño y frene el diseño. Al configurarlo en Width se 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. Mejor solucione eso en lugar de desordenar con los tamaños finales de la ejecución del diseño.

Es exactamente eso, el ancho de procesamiento! = ancho del diseño. Uno está destinado a ser utilizado para el diseño y el otro está diseñado para renderizar. Al igual que con WinForms, había un tamaño y una propiedad de tamaño de cliente, que difieren ligeramente y debe usar el tamaño de representación de Atual / Client y el ancho / alto para el 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 usó. Es posible que este no sea el mismo valor que Width, dependiendo del tamaño de los elementos secundarios y las constricciones de su elemento principal.

El ActualWidth no se establece inmediatamente al configurar la propiedad Width , pero se actualizará (una o más veces) durante el procesamiento.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top