Почему 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.