有条件地设置网格列宽度

时间:2011-12-14 01:35:48

标签: c# wpf xaml

我有一个有两列的网格。我希望最左边列的宽度是网格可用宽度的50%,或者是适合列中包含的任何控件所需的宽度,以较大者为准。我怎样才能做到这一点?

换句话说,我希望色谱柱占据尽可能小的宽度,但最小值为50%。

2 个答案:

答案 0 :(得分:2)

理想情况下,您可以将MinWidth上的ColumnDefintion属性设置为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中输入文本并且文本增长时,该列也会增长。

希望这有帮助!

答案 1 :(得分:-1)

如果先验地知道父亲的宽度,那么这很容易。如果父母的宽度是100,那么:

<Grid>
   <Grid.ColumnDefinitions>
     <ColumnDefinition Width="Auto" MinWidth="50" />
     <ColumnDefinition Width="1*" />
   </Grid.ColumnDefinitions>
</Grid>