【发布时间】:2012-01-19 21:06:31
【问题描述】:
我有一个包含两列的网格。我希望最左边的列的宽度是 Grid 可用宽度的 50%,或者是适合列中包含的任何控件所需的宽度,以较大者为准。我怎样才能做到这一点?
换句话说,我希望列占用尽可能小的宽度,但至少占 50%。
【问题讨论】:
我有一个包含两列的网格。我希望最左边的列的宽度是 Grid 可用宽度的 50%,或者是适合列中包含的任何控件所需的宽度,以较大者为准。我怎样才能做到这一点?
换句话说,我希望列占用尽可能小的宽度,但至少占 50%。
【问题讨论】:
理想情况下,您可以将ColumnDefintion 上的MinWidth 属性设置为0.5*。但是,此属性需要 Double 而不是 GridLength。要解决此问题,您可以使用转换器采取蛮力方法:
XAML:
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" MinWidth="{Binding ElementName=otherColumn, Path=ActualWidth, Converter={l:DivideByTwoConverter}}" />
<ColumnDefinition x:Name="otherColumn" />
</Grid.ColumnDefinitions>
<TextBox Grid.Column="0" />
<TextBox Grid.Column="1" />
</Grid>
转换器:
public class DivideByTwoConverter : MarkupExtension, IValueConverter
{
public override object ProvideValue(IServiceProvider serviceProvider)
{
return this;
}
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value is double)
{
return (double) value/2;
}
return DependencyProperty.UnsetValue;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
在本例中,列从宽度的一半开始。当您在TextBox 中输入文本并且它会增长时,该列也会增长。
希望这会有所帮助!
【讨论】:
如果先验知道父项的宽度,那么这很容易。如果父母的宽度是 100 那么:
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" MinWidth="50" />
<ColumnDefinition Width="1*" />
</Grid.ColumnDefinitions>
</Grid>
【讨论】: