Я знаю, что это немного поздно, но я просто столкнулся с этой проблемой, и вот мое решение. К сожалению, он недостаточно общий, он работает только для сетки с двумя столбцами, но, вероятно, ее можно адаптировать дальше. Тем не менее, он решает описанную проблему и мою собственную, поэтому здесь идет:
Решение состоит из взлома или обходного пути, однако вы хотите его назвать. Вместо объявления 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
}
Я надеюсь, что это помогает,
Михай ДРЕБОТА
Спасибо за Ваш ответ. Установка столбца в auto - это не поведение, которое я хочу для своей сетки. Любой из столбцов должен иметь *, заставляя его заполнять пространство. Авто не имеет такого поведения. – SaphuA
Да, вы правы! Я экспериментировал еще немного, и на этот раз я нашел это по-настоящему, я думаю ... – Dabblernl
Еще раз спасибо, но это тоже не работает :) Теперь я могу перетащить сплиттер на правую сторону. – SaphuA