当调整包含控件的大小而不剪切其他列时,如何只有*符号wpf网格列调整大小?

时间:2013-06-16 15:39:02

标签: wpf xaml wpf-controls

我有一个包含某些列设置的网格:

<Grid>

    <Grid.ColumnDefinitions>
        <ColumnDefinition Width=".25*" MinWidth="200"/>
        <ColumnDefinition Width="*"/>
        <ColumnDefinition Width="240" />
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto" />
        <RowDefinition Height="Auto" />
        <RowDefinition Height="Auto" />
        <RowDefinition Height="Auto" />
        <RowDefinition Height="100*" />
    </Grid.RowDefinitions>
....Omitting content to keep this simple....
</grid>

当我调整包含控件的宽度时,中间列按预期调整大小到一个点。然后它将开始剪辑第三列,没有明显的原因(中心列仍有空间缩小)。如何强制WPF仅调整中心列的大小,如果中心列的宽度为0,则仅剪切第三列?

2 个答案:

答案 0 :(得分:1)

编辑:

尝试使用MultiValueConverter将第二列的MaxWidth最小化到网格中的可用空间。下面的代码可以解决这个问题:

<强>的Xaml:

    <Grid.ColumnDefinitions>
        <ColumnDefinition Name="col1" Width=".25*" MinWidth="200"/>
        <ColumnDefinition Name="col2" Width="*">
            <ColumnDefinition.MaxWidth>
                <MultiBinding Converter="{StaticResource GridWidthConverter}">
                    <Binding ElementName="col1" Path="MinWidth"/>
                    <Binding ElementName="col3" Path="Width"/>
                    <Binding ElementName="Control" Path="ActualWidth"/>
                </MultiBinding>
            </ColumnDefinition.MaxWidth>
        </ColumnDefinition>
        <ColumnDefinition Name="col3" Width="240" />
    </Grid.ColumnDefinitions>

<强>转换器:

public class GridWidthConverter : IMultiValueConverter
{
    #region IMultiValueConverter Members

    public object Convert(object[] values, System.Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        var col1 = System.Convert.ToDouble(values[0]);
        var col2 = System.Convert.ToDouble(((GridLength)values[1]).Value);
        var control = System.Convert.ToDouble(values[2]);

        var maxWidth = control - (col1 + col2);

        return maxWidth > 0 ? maxWidth : 0;
    }

    public object[] ConvertBack(object value, System.Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
    {
        return null;
    }

    #endregion
}

您可能希望向转换器添加一些错误检查,但它应该为您提供想法。

答案 1 :(得分:0)

我最终搞清楚了问题。理查德·E带领我走向正确的方向。显然,在列和最小宽度上设置*表示法的行为导致了我遇到的行为。具体地说,当第1列由于达到最小宽度而停止收缩时,第2列仅继续以第1列继续收缩时所具有的速率收缩。此版本的xaml正常工作:

    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="200"/>
        <ColumnDefinition Width="*"/>
        <ColumnDefinition Width="240" />
    </Grid.ColumnDefinitions>

我不知道我遇到的行为是否有意。

感谢您的帮助!