Честно говоря, я не поверил вам, когда прочитал это, поэтому мне пришлось самому уйти и проверить это, и вы действительно правы. Я не думаю, что вам повезет найти правила, потому что дальнейшее расследование привело меня к мысли, что это ошибка в сетке WPF. Я выполнил ряд тестов, чтобы выяснить, смогу ли я выяснить поведение, но если вы просто хотите узнать окончательные выводы, не стесняйтесь прокручивать следующую диатрибу.
Извините, если результаты не ясны, они - то, как я написал их как работающий. Первые три числа - это значения размеров, которые я ввел для каждого столбца, а остальные - результирующие размеры.
Тест 1:
<Grid Height="300" Width="300">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="..."/>
<ColumnDefinition Width="..."/>
<ColumnDefinition Width="..."/>
</Grid.ColumnDefinitions>
<Button Grid.ColumnSpan="2" Content="QWERTYUIOP"/>
</Grid>
Сетка 300 X 300 с контроллером шириной 80 пикселей. Сетка состоит из трех столбцов, а контрольные области охватывают столбцы 0 и 1:
30 , auto, * - column 0 - 80, column 1 - 0, column 2 - 220
auto, auto, * - column 0 - 40, column 1 - 40, column 2 - 220
auto, 30 , * - column 0 - 0, column 1 - 80, column 2 - 220
* , 30 , * - column 0 - 135, column 1 - 30, column 2 - 135
* , 30 , 26* - column 0 - 10, column 1 - 30, column 2 - 260
* , auto, * - column 0 - 150, column 1 - 0, column 2 - 150
* , auto, 30* - column 0 - 10, column 1 - 0, column 2 - 290
30 , 30 , * - column 0 - 30, column 1 - 30, column 2 - 240
* , * , 28* - column 0 - 10, column 1 - 10, column 2 - 280
Итак, из этого я могу придумать ряд правил:
- Если элемент охватывает ячейку автоматического размера и ячейку не автоматического размера, ячейка автоматического размера будет иметь размер 0
- Если элемент охватывает фиксированную ячейку и автоматическую ячейку, то ширина фиксированной ячейки увеличится до минимума, который может содержать весь объект
- Если элемент охватывает ячейку * размера и ячейку автоматического размера, тогда ячейка * размера будет иметь ожидаемый размер
- Если элемент охватывает две ячейки автоматического размера, они будут расширяться, чтобы соответствовать объекту и иметь одинаковую ширину
- Если элемент охватывает ячейки, в которых нет автоматической ячейки, то ячейки будут иметь ожидаемый размер
Тест 2:
<Grid ShowGridLines="True" Height="300" Width="300">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="..."/>
<ColumnDefinition Width="..."/>
<ColumnDefinition Width="..."/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Button Grid.ColumnSpan="2" Content="QWERTYUIOP"/>
<Button Grid.Row="1" Grid.Column="1" Content="QWERTYUIOP"/>
</Grid>
Сетка 300 X 300 с 3 столбцами, в которых размещены один элемент управления шириной 80 пикселей, столбцы 0 и 2 в строке 0 и второй элемент управления шириной 80 пикселей только в столбце 1 строки 1
30 , auto, * - column 0 - 30, column 1 - 80, column 2 - 190
auto, auto, * - column 0 - 0, column 1 - 80, column 2 - 220
auto, 30 , * - column 0 - 0, column 1 - 80, column 2 - 220 (*)
* , 30 , * - column 0 - 135, column 1 - 30, column 2 - 135
* , 30 , 26* - column 0 - 10, column 1 - 30, column 2 - 260
* , auto, * - column 0 - 110, column 1 - 80, column 2 - 110
* , auto, 30* - column 0 - 7, column 1 - 80, column 2 - 213
30 , 30 , * - column 0 - 30, column 1 - 30, column 2 - 240
* , * , 28* - column 0 - 10, column 1 - 10, column 2 - 280
(*) Это не совсем то, что происходит. Столбец 1 имеет размер 80, но рисует только часть элемента без охвата. В качестве элементов я использовал кнопки, а хром непокрытой кнопки заполнил первый столбец шириной 80 пикселей, но текст был обрезан до размера 30 пикселей. В основном это было полностью прикручено.
Из этого теста я могу добавить еще два правила:
- Если в промежутке используется автоматический столбец и может получить его размер откуда-то, он будет вести себя как ожидалось
- Если в столбце используется автоматический столбец и он не может получить его размер откуда-то еще, тогда система измерения будет повреждена и может привести к повреждению графики.
Итак, я думаю, мы можем объединить эти правила в одну всеобъемлющую философию:
Если элементы охватывают несколько столбцов, и хотя бы один, но не все из этих столбцов имеет автоматическое изменение размера, должен быть другой, который не охватывает, чтобы обеспечить размер для столбцов с автоматическим размером. В противном случае поведение будет в лучшем случае неожиданным, а в худшем - разрушительным.
Не стесняйтесь поднимать ошибку в Microsoft, но так как теперь это определенное поведение элемента управления сеткой, я думаю, что мы застряли с ним на протяжении всего срока службы WPF.