Pregunta

Estoy un poco confundido con cómo ActualWidth o ActualHeight funciona o cómo se calcula.

<Ellipse Height="30" Width="30" Name="rightHand" Visibility="Collapsed">
    <Ellipse.Fill>
        <ImageBrush ImageSource="Images/Hand.png" />
    </Ellipse.Fill>
</Ellipse>

Cuando uso el código anterior, obtengo 30 por ActualWidth y ActualHeight.pero cuando defino programáticamente una Elipse, el ActualWidth y ActualHeight son 0, incluso si defino el atributo de altura (máxima) y ancho (máximo), no entiendo cómo puede ser 0.

¿Fue útil?

Solución

ActualWidth y ActualHeight se calculan después de llamar Measure y Arrange.

El sistema de diseño de WPF los llama automáticamente después de insertar el control en el árbol visual (en DispatcherPriority.Render En mi humilde opinión, lo que significa que estarán en cola para su ejecución y los resultados no estarán disponibles al instante).
Puede esperar a que estén disponibles poniendo en cola una acción en DispatcherPriority.Background) o llamando a los métodos manualmente.

Ejemplo de variante de despachador:

Ellipse ellipse = new Ellipse();

ellipse.Width = 150;
ellipse.Height = 300;

this.grid.Children.Add(ellipse);

this.Dispatcher.BeginInvoke(DispatcherPriority.Background, new Action(() =>
{
    MessageBox.Show(String.Format("{0}x{1}", ellipse.ActualWidth, ellipse.ActualHeight));
}));

Ejemplo de llamada explícita:

Ellipse ellipse = new Ellipse();

ellipse.Width = 150;
ellipse.Height = 300;

ellipse.Measure(new Size(1000, 1000));
ellipse.Arrange(new Rect(0, 0, 1000, 1000));

MessageBox.Show(String.Format("{0}x{1}", ellipse.ActualWidth, ellipse.ActualHeight));
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top