Je sais que c'est un peu en retard, mais je viens de rencontrer ce problème, et voici ma solution. Malheureusement ce n'est pas assez général, il ne fonctionne que pour une grille à deux colonnes, mais il peut probablement être adapté plus loin. Cependant, il résout le problème décrit et le mien, alors voici:
La solution consiste en une bidouille ou une solution de contournement, mais vous voulez l'appeler. Au lieu de déclarer MinWidth pour les colonnes gauche et droite, vous déclarez une valeur MinWidth et une valeur MaxWidth pour la première colonne. Cela signifie que GridSplitter ne se déplacera pas à droite d'un emplacement défini. Jusqu'ici tout va bien.
Le problème suivant est que si nous avons un conteneur redimensionnable (la fenêtre dans mon cas), cela ne suffit pas. Cela signifie que nous ne pouvons pas agrandir la colonne de gauche autant que nous le voulons, même s'il y a beaucoup d'espace pour le second. Heureusement, il existe une solution: se lier à la grille ActualWidth et utiliser un convertisseur d'addition. Le paramètre du convertisseur sera en fait la Largeur Min souhaitée pour la colonne de droite, évidemment la valeur négative, puisque nous devons la soustraire de la Largeur de la Grille. Vous pouvez également utiliser un SubtractConvertor, mais cela dépend de vous.
va ici le XAML et le code:
<Grid Background="{DynamicResource MainBackground}" x:Name="MainGrid" >
<Grid.ColumnDefinitions>
<ColumnDefinition Width="200" MinWidth="100" MaxWidth="{Binding Path=ActualWidth, RelativeSource={RelativeSource AncestorType=Grid}, Converter={Converters:AdditionConverter}, ConverterParameter=-250}" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<GridSplitter Width="3" VerticalAlignment="Stretch" Grid.Column="0"/>
<!-- your content goes here -->
</Grid>
et le convertisseur:
[ValueConversion(typeof(double), typeof(double))]
public class AdditionConverter : MarkupExtension, IValueConverter
{
#region IValueConverter Members
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
double dParameter;
if (targetType != typeof(double) ||
!double.TryParse((string)parameter, NumberStyles.Any, CultureInfo.InvariantCulture, out dParameter))
{
throw new InvalidOperationException("Value and parameter passed must be of type double");
}
var dValue = (double)value;
return dValue + dParameter;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotSupportedException();
}
#endregion
#region Overrides of MarkupExtension
/// <summary>
/// When implemented in a derived class, returns an object that is set as the value of the target property for this markup extension.
/// </summary>
/// <returns>
/// The object value to set on the property where the extension is applied.
/// </returns>
/// <param name="serviceProvider">Object that can provide services for the markup extension.
/// </param>
public override object ProvideValue(IServiceProvider serviceProvider)
{
return this;
}
#endregion
}
J'espère que cette aide,
Mihai Drebot
Merci pour votre réponse. Définir la colonne avec auto n'est pas le comportement que je veux pour ma grille. L'une ou l'autre des colonnes doit avoir le *, ce qui le remplit dans l'espace. Auto n'a pas ce comportement. – SaphuA
Oui, vous avez raison! J'ai expérimenté un peu plus et cette fois je l'ai trouvé pour de vrai je pense ... – Dabblernl
Merci encore, mais ça ne marche pas non plus :) Je peux maintenant faire glisser le splitter sur le côté droit. – SaphuA