想了一下,我想我有一个可以接受的解决方法。我并不完全满意,如果有人有更好的(更清洁!)解决方案,那么我真的很想知道。
解决方法依赖于只要为该列(而不仅仅是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列是什么个网格:
列MinWidth /电网的总宽度=百分比
最小宽度= 300 总宽= 478
478分之300= 62.7%
然后改变XAML中来设置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>
我我会离开这个“没有回答”几天,看看有没有人能想出一个更清洁的解决方案(上面的解决方案真的是一个黑客!)。