2009-03-03 12 views
42

Actualmente estoy trabajando con Panel s en WPF, y noté que con respecto a las propiedades Width y Height, también hay otras dos propiedades llamadas ActualWidth y ActualHeight.¿Cuál es la diferencia entre Width y ActualWidth en WPF?

ActualWidth

Obtiene el ancho representado de este elemento . Esta es una propiedad de dependencia . (Se hereda de FrameworkElement.)

Width

Obtiene o define la anchura del elemento. Esta es una propiedad de dependencia. (Se hereda de FrameworkElement.)

Referencia: MSDN

Puede alguien señalar las diferencias entre los dos y cuando usar cada uno?

Respuesta

62

Width/Height es el solicitado o diseño tamaño. Si configura en Auto, entonces el valor es double.NaN cuando accede a la propiedad en el código subyacente.

ActualWidth/ActualHeight es el prestados talla. Si quiere/necesita el tamaño real del artículo, entonces use este atributo.

+7

En realidad, el tamaño del diseño no es el tamaño representado. – chuckj

+2

@chuckj, ¿qué atributo usaría uno para obtener el tamaño representado? – dumbledad

+0

@dumbledad '.RenderSize.Width' – Mafii

3

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.

De MSDN:

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

0

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.

0

Puede establecer la propiedad Width, pero no la propiedad ActualWidth.

La propiedad Width se utiliza 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 inmediatamente al establecer la propiedad Width, pero se actualizará (una o más veces) durante el procesamiento.

7

ActualWidth cuentas de relleno en el valor por lo que cada vez que necesite saber ese número puede llamar al Actualwidth en lugar de ancho y evitar el cálculo.

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

10

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á limitado 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> 
3

hay una muy buena razón no utilizar el ActualWidth para unirse a (obviamente ActualHeight en consecuencia). 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 una vez finalizado el proceso de disposición del 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, yo tenía un control que tenía su propiedad de tamaño anular en un estilo que se fijaría a la 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 hiciera más pequeño y frenaría el diseño. Si se establece en la Width resolverá el problema (hacer):

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

Si usted tiene que utilizar 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.

+1

Sus fragmentos de código (" dont do "y" do ") son exactamente iguales?!?! – PIntag

+0

Gracias por el comentario. Solucionado eso. – Pascal

+1

@tuner No estoy de acuerdo con esto: "Si tiene que usar el Ancho real, en general algo está mal con su xaml". No hay nada de malo en vincular 'ActualWidth' (o' ActualHeight'), de hecho, en ciertos casos, esta puede ser la forma más fácil de resolver un problema de diseño en particular. El hecho de que el enlace a estas propiedades cause problemas en ocasiones (raras) no es motivo para evitarlas por completo. –

Cuestiones relacionadas