Я знаю, что это немного поздно, но я просто столкнулся с этой проблемой, и вот мое решение. К сожалению, он не является достаточно общим, он работает только для сетки с двумя столбцами, но, вероятно, его можно адаптировать дальше. Однако, это решает описанную проблему и мою собственную, так что здесь идет:
Решение состоит во взломе или обходном пути, однако вы хотите его назвать. Вместо того, чтобы объявлять MinWidth для левого и правого столбца, вы объявляете MinWidth и MaxWidth для первого столбца. Это означает, что GridSplitter не будет перемещаться вправо от определенного местоположения. Все идет нормально.
Следующая проблема заключается в том, что если у нас есть контейнер с изменяемым размером (окно в моем случае), этого недостаточно. Это означает, что мы не можем увеличить левую колонку настолько, насколько мы хотим, даже если для второй может быть достаточно места. К счастью, есть решение: привязка к Grid ActualWidth и использование дополнительного конвертера. Параметр конвертера фактически будет желаемой MinWidth для правого столбца, очевидно, отрицательным значением, поскольку нам необходимо вычесть его из ширины сетки. Вы также можете использовать SubtractConvertor, но это ваше дело.
Здесь идет xaml и код:
<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>
и конвертер:
[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
}
Надеюсь, это поможет,
Михай Дребот