Почему WPF Grid не разделяет пространство одинаково, когда средний столбец имеет MinWidth?

В этом примере первый столбец получает 100, а следующие 2 столбца получают 50 каждый, что является ожидаемым поведением.

<Grid Width="200" Height="200">
    <Grid.ColumnDefinitions>
        <ColumnDefinition MinWidth="100" />
        <ColumnDefinition />
        <ColumnDefinition />
    </Grid.ColumnDefinitions>
    <Border Background="Red" Grid.Column="0" />
    <Border Background="Yellow" Grid.Column="1" />
    <Border Background="Blue" Grid.Column="2" />
</Grid>

alt text

Если я перемещаю MinWidth в средний столбец...

<Grid Width="200" Height="200">
    <Grid.ColumnDefinitions>
        <ColumnDefinition />
        <ColumnDefinition MinWidth="100" />
        <ColumnDefinition />
    </Grid.ColumnDefinitions>
    <Border Background="Red" Grid.Column="0" />
    <Border Background="Yellow" Grid.Column="1" />
    <Border Background="Blue" Grid.Column="2" />
</Grid>

... тогда первый столбец получает 33.3 и последний столбец 66.6, который кажется странным. Не уверен, почему это должно изменить поведение сетки. Я бы ожидал, что столбцы 0 и 2 получат 50.

alt text

Обновление: я понимаю, почему это происходит, но задавался вопросом, думает ли кто-нибудь об ошибке (тем более, что поведение в Silverlight отличается)

Ответ 1

Эта проблема возникает только тогда, когда у вас есть центральный столбец, что означает, что у вас есть нечетное количество столбцов, определенных для вашей сетки. Я не уверен, почему это происходит, и я не думаю, что это преднамеренное поведение. Но еще один способ - всегда обеспечить, чтобы у вас было четное количество столбцов, даже если вы используете только нечетное число из них (скрывая дополнительный столбец с помощью MaxWidth = 0).

    <Grid Width="200" Height="200">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*" />
            <ColumnDefinition Width="*" MinWidth="100"/>
            <ColumnDefinition Width="*" />
            <ColumnDefinition Width="*" MaxWidth="0"/> <!--Workaround-->
        </Grid.ColumnDefinitions>

        <Border Grid.Column="0" Background="Red"/>
        <Border Grid.Column="1" Background="Yellow"/>
        <Border Grid.Column="2" Background="Blue"/>
    </Grid>

Недостаток здесь: у вас есть пустой столбец в вашей сетке. Преимущество заключается в том, что вы получаете ожидаемое поведение распределения пространства.

Ответ 2

Просто обновление.. Я пробовал фрагмент XAML с комбинацией .NET 3.5/4.0 Silverlight 3/4 и по-прежнему не мог получить равную ширину для второго примера...

Этот XAML был единственным способом обойти эту проблему:

<Grid Width="200" Height="200">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width=".5*" />
            <ColumnDefinition MinWidth="100" />
            <ColumnDefinition Width=".5*" />
        </Grid.ColumnDefinitions>
        <Border Background="Red" Grid.Column="0" />
        <Border Background="Yellow" Grid.Column="1" />
        <Border Background="Blue" Grid.Column="2" />
    </Grid>

Любое обновление на вашей стороне ребята?

Ответ 3

не уверен, в чем проблема, но эти две сетки ведут себя так, как вы хотите. Мне нравится второй больше, чем первый, поскольку он явно указывает, что первый и третий столбцы должны занимать оставшееся пространство одинаково.

<Grid Width="200" Height="200">
    <Grid.ColumnDefinitions>
        <ColumnDefinition />
        <ColumnDefinition MinWidth="100" Width="Auto" />
        <ColumnDefinition />
    </Grid.ColumnDefinitions>
    <Border Background="Red" Grid.Column="0" />
    <Border Background="Yellow" Grid.Column="1" />
    <Border Background="Blue" Grid.Column="2" />
</Grid>



<Grid Width="200" Height="200">
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="1*" />
        <ColumnDefinition MinWidth="100" Width="Auto" />
        <ColumnDefinition Width="1*" />
    </Grid.ColumnDefinitions>
    <Border Background="Red" Grid.Column="0" />
    <Border Background="Yellow" Grid.Column="1" />
    <Border Background="Blue" Grid.Column="2" />
</Grid>

Ответ 4

Если вы хотите равную ширину, вы не можете использовать Авто. Вы должны явно установить ширину каждого столбца в нужную пропорцию, для трех столбцов, которые вы хотите ".3 *" для каждого. MinWidth имеет преимущество, если вычисленная ширина становится меньше MinWidth.