2011-06-19 26 views
21

Quiero saber la altura de todos los artículos my StackPanel.Stackpanel: Altura vs ActualHeight vs ExtentHeight vs ViewportHeight vs DesiredSize vs RenderSize

¿Cuál es la diferencia entre:

  • Height - Obtiene o establece el alto sugerido del elemento.
  • ActualHeight - Obtiene la altura renderizada de este elemento. (readonly)
  • ExtentHeight - Obtiene un valor que contiene el tamaño vertical de la extensión. (readonly)
  • ViewportHeight - Obtiene un valor que contiene el tamaño vertical de la ventana gráfica del contenido. (readonly)
  • DesiredSize - Obtiene el tamaño que este elemento calculó durante el paso de medida del proceso de disposición. (readonly)
  • RenderSize - Obtiene (o establece, pero vea Comentarios) el tamaño de renderizado final de este elemento.

De MSDN:

Height
Obtiene o define la altura del elemento sugerido.

Valor de la propiedad: Double - La altura del elemento, en unidades independientes del dispositivo (1/96th inch por unidad).

La altura del elemento, en unidades independientes del dispositivo (1/96th inch por unidad).

 

ActualHeight (de sólo lectura)
Obtiene la altura representado de este elemento.

Valor de la propiedad: Double - La altura del elemento, como un valor en unidades independientes del dispositivo (1/96th de pulgada por unidad).

Esta propiedad es un valor calculado en función de otras entradas de altura y del sistema de disposición. El valor es establecido por el propio sistema de disposición, basado en un pase de representación real, y por lo tanto puede retrasarse ligeramente por debajo del valor establecido de propiedades como Height que son la base del cambio de entrada.

Dado que ActualHeight es un valor calculado, debe tener en cuenta que podría haber cambios múltiples o incrementales informados en él como resultado de diversas operaciones realizadas por el sistema de disposición. El sistema de disposición puede calcular el espacio de medida requerido para elementos secundarios, las restricciones del elemento principal, etc.

 

ExtentHeight (de sólo lectura)
consigue un valor que contiene el tamaño vertical de la medida.

Altura de la propiedad: Double - A Doble que representa el tamaño vertical de la extensión.

El valor devuelto se describe en Píxeles independientes del dispositivo.

 

ViewportHeight (de sólo lectura)
consigue un valor que contiene el tamaño vertical de la ventana gráfica del contenido.

Valor de la propiedad: Double - El doble que representa el tamaño vertical de la ventana gráfica del contenido.

El valor devuelto se describe en Píxeles independientes del dispositivo.

 

DesiredSize (de sólo lectura)
obtiene el tamaño que este elemento calcula durante el paso de la medida del proceso de diseño.

Valor de la propiedad: Size - El tamaño calculado, que se convierte en el tamaño deseado para el pase de organización.

El valor devuelto por esta propiedad solo será una medida válida si el valor de la propiedad IsMeasureValid es verdadero.

DesiredSize suele comprobarse como uno de los factores de medición cuando implementa anulaciones de comportamiento de disposición como ArrangeOverride, MeasureOverride o OnRender (en el caso de OnRender, puede verificar RenderSize, pero esto depende de su implementación). Dependiendo de la situación, su lógica de implementación podría respetar DesiredSize, se podrían aplicar restricciones en DesiredSize, y dichas restricciones también podrían cambiar otras características del elemento padre o elemento hijo. Por ejemplo, un control que admite regiones desplazables (pero elige no derivar de los controles de nivel de marco de WPF que ya habilitan las regiones desplazables) podría comparar el tamaño disponible con el Tamaño deseado. El control podría establecer un estado interno que habilite las barras de desplazamiento en la interfaz de usuario para ese control. O, DesiredSize también podría ser ignorado en ciertos escenarios.

 

RenderSize Obtiene el tamaño de render final de este elemento.

Valor de la propiedad: Size - El tamaño representado para este elemento.

Esta propiedad se puede utilizar para verificar el tamaño de renderizado aplicable dentro de las anulaciones del sistema de disposición como OnRender o GetLayoutClip.

Un escenario más común es manejar el evento SizeChanged con la anulación del controlador de clase o el evento OnRenderSizeChanged.


En mi caso quiero conocer la deseada altura de todos los elementos de la StackPanel.

En otras palabras: Quiero saber la altura de todos los elementos de la StackPanel (antes de dibujo), y si eran para desbordar el panel, voy a

  • eliminar
  • encogimiento escala
  • ajustar

artículos para asegurarse de que encajan en el StackPanel.

lo que significa que es probable que quieran obtener la deseada altura (ExtentHeight DesiredSize??) Durante un evento de cambiar el tamaño de (SizeChangedLayoutUpdated??) - antes de que ocurra cualquier dibujo (por lo que es más rápido).

La mayoría de estas propiedades devuelven cero; así que obviamente hay una cierta comprensión de lo que significan estas propiedades que no sé y no se explican en la documentación.

Respuesta

14

Como sabe, el StackPanel es un objeto [Panel]. Cada panel se comunica con sus hijos mediante dos métodos para determinar los tamaños y posiciones finales. El primer método es MeasureOverride y el segundo es ArrangeOverride.

MeasureOveride pregunta a cada niño por el tamaño deseado con una cantidad determinada de espacio disponible. ArrangeOverride organiza los niños una vez que se ha completado la medición.

Vamos a crear un StackPanel:

public class AnotherStackPanel : Panel 
{ 
    public static readonly DependencyProperty OrientationProperty = 
     DependencyProperty.Register(“Orientation”, typeof(Orientation), 
     typeof(SimpleStackPanel), new FrameworkPropertyMetadata(
     Orientation.Vertical, FrameworkPropertyMetadataOptions.AffectsMeasure)); 

    public Orientation Orientation 
    { 
     get { return (Orientation)GetValue(OrientationProperty); } 
     set { SetValue(OrientationProperty, value); } 
    } 

    protected override Size MeasureOverride(Size availableSize) 
    { 
     Size desiredSize = new Size(); 

     if (Orientation == Orientation.Vertical) 
      availableSize.Height = Double.PositiveInfinity; 
     else 
      availableSize.Width = Double.PositiveInfinity; 
     foreach (UIElement child in this.Children) 
     { 
      if (child != null) 
      { 
       child.Measure(availableSize); 

       if (Orientation == Orientation.Vertical) 
       { 
        desiredSize.Width = Math.Max(desiredSize.Width, 
        child.DesiredSize.Width); 
        desiredSize.Height += child.DesiredSize.Height; 
       } 
       else 
       { 
        desiredSize.Height = Math.Max(desiredSize.Height, 
        child.DesiredSize.Height); 
        desiredSize.Width += child.DesiredSize.Width; 
       } 
      } 
     } 
     return desiredSize; 
    } 

    protected override Size ArrangeOverride(Size finalSize) 
    { 
     double offset = 0; 
     foreach (UIElement child in this.Children) 
     { 
      if (child != null) 
      { 
       if (Orientation == Orientation.Vertical) 
       {    
        child.Arrange(new Rect(0, offset, finalSize.Width, 
        child.DesiredSize.Height));     
        offset += child.DesiredSize.Height; 
       } 
       else 
       {     
        child.Arrange(new Rect(offset, 0, child.DesiredSize.Width, 
        finalSize.Height)); 
        offset += child.DesiredSize.Width; 
       } 
      } 
     } 
     return finalSize; 
    } 
} 
  • El DesiredSize (el tamaño devuelto por MeasureOverride) es suma de tamaños de los niños en la dirección de StackPanel y el tamaño de la mayor niño en el otra dirección.

  • RenderSize representa el tamaño final de la StackPanel después diseño se ha completado.

  • ActualHeight es exactamente igual que RenderSize.Height.

Para confiar en estas propiedades, debe acceder a ellas solo dentro de un controlador de eventos para el evento LayoutUpdated.

3

encima respuesta es correcta, excepto que RenderSize y ActualHeight pueden tener valores diferentes temporalmente. RenderSize se establece antes de OnRender, mientras que ActualHeight se establece una vez que WPF ha terminado el diseño y procesa el procesamiento para ese control. Al final, LayoutUpdated se levanta.

Por lo tanto, RenderSize se puede utilizar dentro de OnRender, pero ActualHeight seguirá teniendo el valor anterior antes de que se inicie el diseño.

La secuencia es así:

MeasureOverride() => sets DesiredSize 
ArrangeOverride() => sets RenderSize 
OnRender() 

WPF podría ejecutar esta secuencia varias veces (recursividad). Una vez que todo está resuelto, lo siguiente es ejecutado:

ActualHeight = RenderSize.Height 

ActualHeight se puede acceder en cualquier momento después de la primera disposición que se hace, excepto durante el propio proceso de diseño de la medida, organizar y render (!). WPF garantiza que cualquier código se complete antes de que se ejecute el procesamiento de disposición.

Cuestiones relacionadas