2015-07-30 2 views
2

У меня есть ситуации, как это:StackPanel высота превышает высоту родительской сетки

<UserControl> 
    <Grid x:Name="fullGrid" VerticalAlignment="Stretch"> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="*"/> 
     </Grid.RowDefinitions> 
     <Grid x:Name="innerGrid" VerticalAlignment="Stretch"> 
      <Grid.RowDefinitions> 
       <RowDefinition Height="*"/> 
      </Grid.RowDefinitions> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="Auto" /> 
       <ColumnDefinition Width="*" /> 
      </Grid.ColumnDefinitions> 
      <StackPanel x:Name="leftSide" VerticalAlignment="Stretch"> 
       <ScrollViewer VerticalAlignment="Stretch"> 
        <ItemsControl/ VerticalAlignment="Stretch"> 
       </ScrollViewer> 
      </StackPanel> 
     </Grid> 
    </Grid> 
</UserControl> 

Проблема заключается в том, что leftSide StackPanel высота выше, чем его родители: innerGrid высоты.

Я отлаживал его в Snoop, и кажется, что StackPanel просто игнорирует его свойство VerticalAlignment.

Я хотел бы избежать установки Heigh={Binding ElementName=xxx, Path=ActualHeight}, потому что у меня есть некоторые дополнительные Margins внутри, и это нарушает вид.

Как я могу справиться с этим?

+2

Какая-либо конкретная причина, по которой вы сначала просматриваете средство просмотра прокрутки на панели стека? Основной ответ заключается в том, что вы не можете этого сделать, но есть обходные пути – BradleyDotNET

+0

Нет причин для обхода ScrollViewer. И удаление его работает! Не могли бы вы объяснить мне механику? – Tomasz

+1

В основном StackPanel должен определить размер своих детей. Теперь ScrollViewer внутри него не сообщает размер, но требует, чтобы его родитель сообщал размер, который ScrollViewer будет настраивать сам. Поскольку ни один из двух элементов управления не получает то, что ему нужно, они не могут изменять размер/визуализировать то, как они должны. –

ответ

1

ScrollViewer заполняет его родительский элемент. StackPanel хочет по размеру своих детей, и поэтому говорит им, что у них столько места, сколько они хотят (а затем «сжимается, чтобы соответствовать»).

Итак, StackPanel сообщает, что ScrollViewer может иметь все пространство в мире, которое он с радостью принимает. Невозможно остановить это, помимо выполнения привязки, когда вы описываете или устанавливаете абсолютную высоту.

Таким образом, простым решением является удаление StackPanel. Затем ScrollViewer займет место, которое Grid присваивает ему.