Alors voila le topo: j’ai une grid avec des splitters dedans pour changer la taille des colonnes:
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition MinWidth="200" Name="column0"/>
<ColumnDefinition MinWidth="200" Name="column1"/>
<ColumnDefinition MinWidth="200" Name="column2"/>
</Grid.ColumnDefinitions>
<Rectangle Grid.Column="0" Fill="Red"/>
<Rectangle Grid.Column="1" Fill="Blue"/>
<Rectangle Grid.Column="2" Fill="Green"/>
<GridSplitter Grid.Column="0" VerticalAlignment="Stretch"
HorizontalAlignment="Right" Width="4"/>
<GridSplitter Grid.Column="1" VerticalAlignment="Stretch"
HorizontalAlignment="Right" Width="4"/>
</Grid>
Je voudrais à la fermeture sauver la taille de mes colonnes et pouvoir les refixer lors du chargement suivant.
Du coup, bêtement, lors du chargement je faisais ça:
column0.SetValue(ColumnDefinition.WidthProperty, new GridLength(300));
column1.SetValue(ColumnDefinition.WidthProperty, new GridLength(300));
column2.SetValue(ColumnDefinition.WidthProperty, new GridLength(300));
Et bien je vous le donne en mille : ça ne marche pas! En effet, lorsque je bouge par la suite mes colonnes, la taille des colonnes semblent vouloir rester constante et le comportement global est inadapté.
La solution, comme toujours, est simple. En effet, les colonnes ont une propriété Width (et Height) qui n’est pas qu’un double mais un objet de type GridLength. Or ce dernier permet d’exprimer des tailles absolues (comme ci-dessus) mais aussi des tailles relatives (le célèbre “300*”).
Ainsi, pour conserver le comportement des colonnes tout en remettant les tailles de départ correctement il suffisait d’exprimer les tailles en relatif:
column0.SetValue(ColumnDefinition.WidthProperty, new GridLength(300,
GridUnitType.Star));
column1.SetValue(ColumnDefinition.WidthProperty, new GridLength(300,
GridUnitType.Star));
column2.SetValue(ColumnDefinition.WidthProperty, new GridLength(300,
GridUnitType.Star));
WPF
Le truc à la con du jour