Подумав немного, думаю, у меня есть приемлемый обходной путь. Я не совсем доволен этим, и если у кого-то есть лучшее (более чистое!) Решение, я бы очень хотел знать.
Обходной путь основан на том факте, что правильное поведение отображается, пока для столбца установлено свойство Width (не только MinWidth). Таким образом, ответ заключается в том, чтобы всегда задавать для свойства Width (через связывание) правильный процент сетки (в основном то, что WPF должен делать для меня).
Для этого сначала создайте конвертер, который может выполнять умножение:
public class MultiplicationConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (value == null) return double.NaN;
return (double)value * double.Parse((string)parameter);
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
Затем рассчитайте, какой процент сетки составляет столбец MinWidth:
Мин. Ширина столбца / Общая ширина сетки = процент
Мин. Ширина = 300
Общая ширина = 478
300/478 = 62,7%
Затем измените Xaml, чтобы в столбце Width столбца MinWidth указывался процент сетки (обратите внимание, что пространство имен преобразователя изменится на любое пространство имен, в которое вы его поместите):
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WpfApplication1"
Title="MainWindow" Height="350" Width="500" >
<Window.Resources>
<local:MultiplicationConverter x:Key="MultiplicationConverter" />
</Window.Resources>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition MinWidth="300" Width="{Binding ActualWidth, RelativeSource={RelativeSource AncestorType={x:Type Grid}}, Converter={StaticResource MultiplicationConverter}, ConverterParameter=0.627}" />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<TextBox Grid.Column="1" ScrollViewer.CanContentScroll="True" ScrollViewer.HorizontalScrollBarVisibility="Auto" Text="abc abc abc abc abc abc abc abc abcabc abc abcabc abc abc abc abc abc" />
</Grid>
</Window>
Я собираюсь оставить это «без ответа» на несколько дней, чтобы посмотреть, сможет ли кто-нибудь придумать более чистое решение (решение, приведенное выше, действительно является взломом!).