【问题标题】:Conditionally set grid column width有条件地设置网格列宽
【发布时间】:2012-01-19 21:06:31
【问题描述】:

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

换句话说,我希望列占用尽可能小的宽度,但至少占 50%。

【问题讨论】:

    标签: c# wpf xaml


    【解决方案1】:

    理想情况下,您可以将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 中输入文本并且它会增长时,该列也会增长。

    希望这会有所帮助!

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-04-01
        • 1970-01-01
        • 2012-11-27
        • 1970-01-01
        • 2010-10-30
        • 2011-02-02
        • 2022-10-16
        相关资源
        最近更新 更多