попытка понять следующее:
<Grid Name="Root">
<Grid.RowDefinitions>
<RowDefinition Height="*" />
<RowDefinition Height="*" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
</Grid>
Кто-либо может помочь мне в объяснении различия между * и Автоматический в вышеупомянутом отрывке?
спасибо
Авто
означает присвоение этому столбцу / строке размера содержащихся в нем элементов.
*
означает совместное использование оставшейся части доступного пространства с другими столбцами / строками, которые также указывают *
.
Фактически *
эквивалентно 1 *
. Можно указать 2 *
, 3 *
... N *
для ширины или высоты. Алгоритм, который использует Silverlight, состоит в том, чтобы суммировать все значения N для всех строк, используя *
, а затем выделить каждой строке соответствующую долю доступного пространства. Например: -
<Grid.RowDefinitions>
<RowDefinition Height="*" />
<RowDefinition Height="2*" />
<RowDefinition Height="3*" />
<RowDefinition Height="Auto" />
</Grid.Definitions>
Это сначала определит, какой высоты должна быть четвертая строка из ее содержимого, и вычтет это из полной доступной высоты. Оставшаяся часть высоты будет разделена между строками *
. Первый получает 1/6, второй - 1/3, а третий - 1/2 доступной высоты.
Auto
сделает размер каждой колонки таким, чтобы в нее поместилось все, что в ней содержится.
*
будет использовано максимальное количество свободного места. Лучше всего использовать, когда у вас есть "оставшийся" столбец, который вы хотите просто изменить размер на любой оставшийся.
Пример сетки неопределенной ширины.
Сценарий 1:
Column 1 | Column 2 | Column 3
----------------------------------
100 Width | Auto | 200 Width
В этом случае столбец 2 может быть любым между 1 и тем, что требует размещенное в нем содержимое, и максимальным пространством, доступным для ширины сетки. Если столбец 2 был изменен на *
и ширина определена для грида в целом, то он заполнит оставшееся пространство для достижения ширины грида. Если бы у вас было два столбца, установленных как *
, и определена ширина сетки, то они бы конкурировали за оставшееся пространство и разделили его.
Обычно я использую *
только для одной колонки (хотя это не правило), если у меня есть элемент управления с динамическим размером, чтобы колонка заполняла все пространство, оставленное другими колонками. Это удобно, если вам нужны столбцы определенного размера для элемента управления динамического размера, и вы хотите, чтобы определенные столбцы оставались фиксированными, а один столбец расширялся и заполнял все остальное пространство элемента управления. Auto
не будет делать этого с пустыми или малосодержательными колонками, которые фактически не заполнят оставшееся пространство.
Сценарий 2 (колонка 3 содержит содержимое шириной 100, а общая ширина сетки 800):
Column 1 | Column 2 | Column 3 | Column 4
--------------------------------------------
100 Width | 200 Width | Auto | *
Колонка 3 будет иметь размер только 100. Колонка 4 будет иметь размер 400, чтобы заполнить оставшееся пространство.
На этой странице (предположительно из Silverlight 2, но она все еще действительна) есть несколько примеров использования сетки со следующими пояснениями:
Для каждой строки в сетке у нас есть Элемент RowDefinition. Все определения строк заключены в элемент Grid.RowDefinitions. Наши первые две строки имеют высоту 50 пикселей, а высота третьей строки установлена на «*». Это означает, что строка займет все место в сетке, которое не занято другими строками.
и:
Другой вариант - установить для ширины и / или высоты значение «авто». Таким образом, каждый столбец / строка изменяет свой размер, чтобы соответствовать ширине / высоте элементов управления в нем. Например: