Question

J'ai un Grid dans un Canvas défini comme ceci:

<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>

Mon problème est que, sur le constructeur de la fenêtre, après InitializeComponents() soit Grid.ColumnDefinitions[0].ActualWidth ou .ActualWidth « tout rectangle » sont tous à 0,0 (même pour des hauteurs). Je ne suis pas de déterminer ce qu'il faut faire pour obtenir ces informations. Toute aide?

Observations:

  1. Je ne suis pas définir la largeur de toile extérieure et de la hauteur, mais si je le fais, ça ne résout pas mon problème.
  2. Lors de l'exécution, je peux voir que ce Canvas/Grid occupe tout l'espace de la fenêtre, de sorte que chaque rectangle à l'intérieur il a ActualWidths et ActualHeights
  3. largeur / hauteur de la grille est liée à la toile mais j'essayé d'enlever cette liaison et mon problème persiste.
Était-ce utile?

La solution

ActualHeight et ActualWidth ne sont pas définies jusqu'à ce que la commande est mesurée et agencée. En général, il n'y a rien à InitializeComponent() qui cause une mesure, alors quand il retourne ces sera toujours zéro.

Vous pouvez forcer ceux-ci à être calculé avant en appelant simplement les méthodes de Measure() et Arrange() de la fenêtre manuellement après les déclarations de InitializeComponent() de la fenêtre.

Si vous Dimensionnement au contenu:

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

Si vous utilisez une taille de fenêtre explicite:

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

Autres conseils

Ray est correct (1) que cela est dû au fait que la mesure et organiser des laissez-passer n'a pas encore exécuté. Cependant, plutôt que de forcer un autre passage de mise en page (cher), vous pouvez simplement attendre jusqu'à ce que votre commande a chargé avant d'accéder aux propriétés ActualXxx:

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

}

Dans notre cas, la solution était simple, comme tout le monde dit ActualWidth et ActualHeight nécessaires pour obtenir appelé après la même Loaded est terminée, Donc, nous avons enveloppé tout le code dans un répartiteur et définir la priorité Loaded comme suit:

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

ActualWidth et ActualHeight ne sont disponibles qu'après XAML chargement terminé, avant le chargement, comment pouvez-vous trouver ces paramètres?

Utiliser l'événement Loaded et à l'intérieur faire pour trouver les ActualWidth et ActualHeight.

private void me_Loaded(object sender, RoutedEventArgs e)
{
  // do your stuffs here.
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top