2016-09-21 5 views
0

Я относительный новичок WPF, и я все еще пытаюсь разгадать его основы. Я только что наткнулся на вопрос о размерах сетки, который меня озадачил (и, похоже, это не ограничивается только сетками).Сетка строки auto-size относительный размер вопрос

Проблема заключается в том, что если у меня есть сетка с относительно большими рядами/столбцами, внутри строки/столбца другой сетки, при этом размеры этой строки/столбца устанавливаются в auto, относительный размер для дочерней сетки, по-видимому, имеет нет эффекта.

enter image description here

Что бы ожидать для этого XAML, является то, что внутренние колонны сетками по-прежнему относительно размера (при этом один 3x ширине других), даже если они находятся внутри автоматического размером столбца родителя сетка. Является ли это ожидаемым поведением, является ли это ошибкой или я пропущу что-то основное?

Спасибо!

+1

пожалуйста, введите свой код в виде текста, а не скриншот редактора – ASh

+1

Да, это поведение по умолчанию. 'Авто' означает только необходимый минимум. И поскольку он установлен во внешней 'Grid', он имеет приоритет. – AnjumSKhan

+0

Почему у вас нет первой сетки с тремя столбцами и избавиться от внутренней сетки? – adminSoftDK

ответ

1

похоже внешний Сетка колонка диктат который ширина внутренний Grid должен иметь. Попробуйте обратный порядок измерения путем привязки ширины столбца внутренней ширины сетки: <ColumnDefinition Width="{Binding Path=ActualWidth, ElementName=InnerGrid}"/>

<Grid Background="DarkBlue"> 
    <Grid.Resources> 
     <Style TargetType="Label"> 
      <Setter Property="Foreground" Value="White"/> 
      <Setter Property="BorderBrush" Value="White"/> 
      <Setter Property="BorderThickness" Value="1"/> 
     </Style> 
    </Grid.Resources> 

    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="2*" /> 
     <ColumnDefinition Width="{Binding Path=ActualWidth, ElementName=InnerGrid}"/>    
    </Grid.ColumnDefinitions> 

    <Label Content="Cell 1" /> 

    <Grid Grid.Column="1" Name="InnerGrid" Background="DarkRed"> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="10*" /> 
      <ColumnDefinition Width="3*" /> 
     </Grid.ColumnDefinitions> 
     <Label Content="Cell 2.1" /> 
     <Label Grid.Column="1" Content="Cell 2.2" /> 
    </Grid> 
</Grid> 

после изменения размера только первый столбец увеличивается (см скриншот)

enter image description here

+0

О, вау, спасибо! Это именно то, что я пытался сделать! : D Является ли это просто мной или кажется немного странным, что именно так WPF обрабатывает автоматическую калибровку? Исходя из CSS, это кажется довольно сложным для такой базовой функции. – Ross

2

Попробуйте это:

<Grid Background="DarkBlue"> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="2*" /> 
      <ColumnDefinition /> 
     </Grid.ColumnDefinitions> 
     <Label BorderBrush="White" 
       BorderThickness="1" 
       Content="Cell 1" 
       Foreground="White" /> 
     <Grid Grid.Column="1"> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="10*" /> 
       <ColumnDefinition Width="3*" /> 
      </Grid.ColumnDefinitions> 
      <Label BorderBrush="White" 
        BorderThickness="1" 
        Content="Cell 2" 
        Foreground="White" /> 

      <Label Grid.Column="1" 
        BorderBrush="White" 
        BorderThickness="1" 
        Content="Cell 3" 
        Foreground="White" /> 
     </Grid> 
    </Grid> 

Причина, по которой вторая решетка вела себя странно потому, что столбец первой сетки установлено значение Авто. Так как это авто, он пытается выкопать все, что внутри, чтобы быть как можно меньше - без ярлыков это будет ширина 0 для каждого столбца второй сетки. Кроме того, ширина меток делает их примерно одинаковыми.

Я полагаю, что это имеет какое-то отношение к порядку, в котором WPF вычисляет ширину чего-то в автоматическом столбце/строке.

Первое, что он делает, это уведомление о том, что значение второго значения сетки равно 0. Затем, после этого, добавляется всякая ширина содержимого к этому вычисленному значению - поскольку обе метки примерно одинакового размера, это приводит к двум аналогичным столбцам.

Мое решение удаляет автоматическое значение и вместо этого говорит первый столбец первой сетки «общей ширины, вы получаете 2/3rds пространства, а в другом столбце получает 1/3-й» - это не авто, поэтому второй столбец никоим образом не раздавлен.

+0

Спасибо! Это то, с чем мы закончили, прежде чем я разместил вопрос :) Я думаю, что моя интерпретация Авто была совсем другой. Я думал, что авто просто изменил размер контейнера, чтобы он соответствовал ребенку, в то время как на самом деле он, по-видимому, игнорирует любой размер ребенка и сквозит что-то прямо, что кажется довольно странным ... – Ross

+0

@ Росс Точно. StackPanels работают очень похожим образом. – Logan