Значение * (звездочка) в WPF ColumnDefinition? (взвешенная доля доступного пространства)

В чем смысл * (звездочки) в XAML ниже?

 <ColumnDefinition Width="0.07*"/>
<Grid Height="100" HorizontalAlignment="Left" 
          Margin="102,134,0,0" 
          Name="grid1" VerticalAlignment="Top" 
          Width="354">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="40*" />
            <ColumnDefinition Width="314*" />
        </Grid.ColumnDefinitions>
    </Grid>

Ответ 1

Когда вы определяете столбец в сетке WPF, вы можете задать ширину одного из трех возможных значений:

  • Фиксированная ширина,
  • Auto - столбец станет настолько широким, насколько это необходимо для его детей, или
  • * (звезда) занимает любое оставшееся свободное пространство

* имеет префикс числа (по умолчанию 1, если номер не указан). Доступное пространство делится между столбцами с разделителями пропорционально числу префикса.

Если у вас есть это определение

<Grid.ColumnDefinitions>
  <ColumnDefinition Width="0.07*"/>
  <ColumnDefinition Width="0.93*"/>
</Grid.ColumnDefinitions>

Первый столбец получит 7% от общего объема свободного места, а второй столбец получит 93%. С другой стороны, если у вас есть это определение:

<Grid.ColumnDefinitions>
  <ColumnDefinition Width="0.07*"/>
  <ColumnDefinition Width="0.14*"/>
</Grid.ColumnDefinitions>

Первый столбец получит 1/3 и второй 2/3 доступного пространства.


В вашем конкретном случае, когда ширина сетки равна 354, а пропорции двух столбцов - 40 и 314, вы получаете следующие ширины столбцов:

First column width = 40/(40 + 314)*354 = 40
Second coulmn width = 314/(40 + 314)*354 = 314

Ширина звезды лучше всего использовать, когда ширина сетки не фиксирована. Когда сетка будет изменена, столбцы будут масштабироваться пропорционально, как указано шириной звезды. В вашем случае ширина сетки фиксирована, и вы можете так же легко использовать столбцы фиксированной ширины.

Если вам нужен макет, где второй столбец двойной ширины первого и третьего столбцов, в три раза больше ширины первого, вам нужно это определение:

<Grid.ColumnDefinitions>
  <ColumnDefinition Width="*"/>
  <ColumnDefinition Width="2*"/>
  <ColumnDefinition Width="3*"/>
</Grid.ColumnDefinitions>

Если общая ширина сетки равна 300, вы получаете ширины столбцов 50, 100 и 150. Если общая ширина сетки равна 600, вы получаете ширину столбцов 100, 200 и 300. И так далее.

Ответ 2

Его отношение 0.07 к любому другому столбцу ширины звезды - то есть, если другое ColomnDefinition имеет ширину 0,14, то этот столбец равен ширине = его все о рациях

Ответ 3

[..] значение, выраженное как взвешенная доля доступного пространства.

Ответ 4

Он создает размеры столбцов с использованием коэффициентов. Если у вас было другое определение типа <ColumnDefinition Width="0.03*"/>, первый столбец занял бы 70% пространства, а второй - до 30%.