wpf xaml grid actualwidth actualheight

wpf - ¿Por qué son ActualWidth y ActualHeight 0.0 en este caso?



xaml grid (4)

En nuestro caso, la solución fue simple, ya que todo el mundo dijo que era necesario llamar a ActualWidth y ActualHeight incluso después de que el Loaded finalizara, así que simplemente envolvemos el código en un despachador y establecemos la prioridad en Loaded como se muestra a continuación:

Dispatcher.Invoke(new Action(() => { graphHeight = ActualHeight; graphWidth = ActualWidth; }), DispatcherPriority.Loaded);

Tengo una Grid dentro de un Canvas definido así:

<Canvas x:Name="outerCanvas"> <Grid Grid.Row="1" Name="cGrid" ShowGridLines="True" Width="{Binding Path=ActualWidth, RelativeSource={RelativeSource AncestorType={x:Type Canvas}}}" Height="{Binding Path=ActualHeight, RelativeSource={RelativeSource AncestorType={x:Type Canvas}}}"> <Grid.ColumnDefinitions> <ColumnDefinition /> <ColumnDefinition/> <ColumnDefinition/> </Grid.ColumnDefinitions> <Grid.RowDefinitions> <RowDefinition /> <RowDefinition /> </Grid.RowDefinitions> <Rectangle Name="rectangle1" Stroke="Black" Fill="AntiqueWhite" /> <Rectangle Grid.Row="0" Grid.Column="1" Grid.ColumnSpan="1" Grid.RowSpan="1" Name="rectangle2" Stroke="Black" Fill="AliceBlue" /> <Rectangle Grid.Row="0" Grid.Column="2" Grid.ColumnSpan="1" Grid.RowSpan="1" Name="rectangle3" Stroke="Black" Fill="Aqua" /> <Rectangle Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="3" Grid.RowSpan="1" Name="rectangle4" Stroke="Black" Fill="DarkViolet" /> </Grid> </Canvas>

Mi problema es que, en el constructor Window, después de InitializeComponents() Grid.ColumnDefinitions[0].ActualWidth o "cualquier rectángulo". ActualWidth están todos configurados en 0.0 (lo mismo para las alturas). No estoy averiguando qué hacer para obtener esta información. ¿Alguna ayuda?

Observaciones:

  1. No estoy definiendo el ancho y la altura del lienzo exterior, pero si lo hago, no resuelve mi problema.
  2. En tiempo de ejecución puedo ver que este Canvas/Grid ocupa todo el espacio de la ventana, por lo que cada rectángulo dentro de él tiene ActualWidth s y ActualHeight s
  3. El ancho / alto de la cuadrícula está vinculado al lienzo, pero traté de eliminar este enlace y mi problema aún persiste.

Ray está correcto (+1) que esto se debe al hecho de que la medida y el pase de organización aún no se han ejecutado. Sin embargo, en lugar de forzar otro pase de diseño (costoso), puede esperar hasta que su control se haya cargado antes de acceder a las propiedades de ActualXxx :

public MyWindow() { Loaded += delegate { // access ActualWidth and ActualHeight here }; }


ActualHeight y ActualWidth no se configuran hasta que se mide y ordena el control. Por lo general, no hay nada en InitializeComponent() que cause una medida, por lo tanto, cuando vuelva, seguirá siendo cero.

Puede forzar que se computen antes simplemente llamando a los métodos Measure() y Arrange() la ventana manualmente después de que el InitializeComponent() la ventana regrese.

Si está dimensionando el contenido:

window.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity)); window.Arrange(new Rect(0, 0, window.DesiredSize.Width, window.DesiredSize.Height));

Si está usando un tamaño de ventana explícito:

window.Measure(new Size(Width, Height)); window.Arrange(new Rect(0, 0, window.DesiredSize.Width, window.DesiredSize.Height));


ActualWidth y ActualHeight están disponibles solo después de completar la carga de XAML, antes de cargar ¿cómo puede encontrar estos parámetros?

Use el evento Loaded y en su interior encuentre el ActualWidth ActualHeight ActualWidth y el valor ActualHeight .

private void me_Loaded(object sender, RoutedEventArgs e) { // do your stuffs here. }