1

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

<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,则仅剪切第三列?

4

2 回答 2

1

编辑:

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

xml:

    <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
}

您可能想向转换器添加一些错误检查,但它应该会给您这个想法。

于 2013-06-16T17:08:52.070 回答
0

我最终找出了问题所在。理查德 E 带领我朝着正确的方向前进。显然,在列上设置 * 符号和最小宽度的行为导致了我遇到的行为。具体来说,当第 1 列由于达到最小宽度而停止收缩时,第 2 列只会继续以如果第 1 列也继续收缩的速率继续收缩。此版本的 xaml 工作正常:

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

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

谢谢您的帮助!

于 2013-06-17T13:02:55.467 回答