2010-09-15 5 views
10

Dans cet exemple, la première colonne obtient 100 et les deux colonnes suivantes 50 chacune, ce qui correspond au comportement attendu.Pourquoi la grille WPF ne partage pas l'espace de manière égale lorsque la colonne du milieu a une largeur minimale?

<Grid Width="200" Height="200"> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition MinWidth="100" /> 
     <ColumnDefinition /> 
     <ColumnDefinition /> 
    </Grid.ColumnDefinitions> 
    <Border Background="Red" Grid.Column="0" /> 
    <Border Background="Yellow" Grid.Column="1" /> 
    <Border Background="Blue" Grid.Column="2" /> 
</Grid> 

alt text

Si je déplace la MinWidth à la colonne du milieu ...

<Grid Width="200" Height="200"> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition /> 
     <ColumnDefinition MinWidth="100" /> 
     <ColumnDefinition /> 
    </Grid.ColumnDefinitions> 
    <Border Background="Red" Grid.Column="0" /> 
    <Border Background="Yellow" Grid.Column="1" /> 
    <Border Background="Blue" Grid.Column="2" /> 
</Grid> 

... puis la première colonne obtient 33.3 et la dernière colonne 66,6 qui semble bizarre. Je ne sais pas pourquoi cela devrait changer le comportement de la grille. Je m'attendrais à ce que les colonnes 0 et 2 en obtiennent 50 chacune.

alt text

Mise à jour: Je comprends pourquoi cela arrive, mais me demandais si quelqu'un pense qu'il est un bug (d'autant plus que le comportement dans Silverlight est différent)

+0

Pimping pour les réponses sur twitter? Eh bien, je suppose que ça a marché. – Will

+0

Hmmm. J'utilise C# 3.5 et ma colonne rouge est la taille de votre colonne bleue et ma colonne bleue est la taille de votre colonne rouge pour le second exemple. – Crispy

+0

@Chris oui, il a changé avec 4.0. Je n'ai trouvé nulle part où les changements ont été documentés, donc j'ai ouvert un Connect. – Will

Répondre

1

Juste une mise à jour .. J'ai essayé la XAML snippet avec une combinaison de 3.5/4.0 .NET Silverlight 3/4 et peut toujours pas obtenir une largeur égale pour le deuxième exemple ...

Ce XAML était la seule façon de contourner cette question:

<Grid Width="200" Height="200"> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width=".5*" /> 
      <ColumnDefinition MinWidth="100" /> 
      <ColumnDefinition Width=".5*" /> 
     </Grid.ColumnDefinitions> 
     <Border Background="Red" Grid.Column="0" /> 
     <Border Background="Yellow" Grid.Column="1" /> 
     <Border Background="Blue" Grid.Column="2" /> 
    </Grid> 

Une mise à jour de votre côté les gars?

0

Vous ne savez pas exactement quel est le problème, mais ces deux grilles se comportent comme vous le souhaitez. J'aime la seconde plus que la première, car elle spécifie explicitement que la première et la troisième colonne doivent occuper l'espace des restes de façon égale.

<Grid Width="200" Height="200"> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition /> 
     <ColumnDefinition MinWidth="100" Width="Auto" /> 
     <ColumnDefinition /> 
    </Grid.ColumnDefinitions> 
    <Border Background="Red" Grid.Column="0" /> 
    <Border Background="Yellow" Grid.Column="1" /> 
    <Border Background="Blue" Grid.Column="2" /> 
</Grid> 



<Grid Width="200" Height="200"> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="1*" /> 
     <ColumnDefinition MinWidth="100" Width="Auto" /> 
     <ColumnDefinition Width="1*" /> 
    </Grid.ColumnDefinitions> 
    <Border Background="Red" Grid.Column="0" /> 
    <Border Background="Yellow" Grid.Column="1" /> 
    <Border Background="Blue" Grid.Column="2" /> 
</Grid> 
0

Si vous voulez une largeur égale, vous ne pouvez pas utiliser Auto. Vous devez définir explicitement la largeur de chaque colonne dans la proportion désirée, pour 3 colonnes que vous voulez ".3 *" pour chacune. MinWidth est prioritaire si la largeur calculée devient inférieure à MinWidth.

3

Ce problème se produit uniquement lorsque vous avez une colonne centrale, ce qui implique que vous avez un nombre impair de colonnes définies pour votre grille. Je ne suis pas sûr de savoir pourquoi cela se produit et je ne pense pas que ce soit un comportement intentionnel. Mais, une autre solution consiste à toujours s'assurer que vous avez un nombre pair de colonnes définies même si vous n'utilisez qu'un nombre impair d'entre eux (masquer la colonne supplémentaire en utilisant MaxWidth = 0).

<Grid Width="200" Height="200"> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="*" /> 
      <ColumnDefinition Width="*" MinWidth="100"/> 
      <ColumnDefinition Width="*" /> 
      <ColumnDefinition Width="*" MaxWidth="0"/> <!--Workaround--> 
     </Grid.ColumnDefinitions> 

     <Border Grid.Column="0" Background="Red"/> 
     <Border Grid.Column="1" Background="Yellow"/> 
     <Border Grid.Column="2" Background="Blue"/> 
    </Grid> 

Inconvénient: vous avez une colonne vide dans votre grille. L'avantage est que vous obtenez le comportement de distribution d'espace attendu.

+0

Le problème a été résolu dans .NET 4.5 – TMSoftDev

Questions connexes