2012-02-07 2 views
0

У меня есть ListView (завернутый в ScrollViewer), который изменяет размеры, если элементы inseretd превышают видимую область до тех пор, пока не достигнут максимальная высота родителей.понимание WPF Layout

ListView встроен следующим образом.

<Window ... SizeToContent="Height"> 
    <Grid> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="2*"/> 
      <RowDefinition Height="*" /> 
      <RowDefinition Height="*" /> 
     </Grid.RowDefinitions> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="3*" /> 
      <ColumnDefinition Width="2*" />        
     </Grid.ColumnDefinitions> 

     <ScrollViewer x:Name="MyScrollViewer" Grid.Row="0" Grid.Column="0" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"> 
      <ListView Name="MyListView" 
         ItemsSource="{Binding Path=RetrievalStringResults, Mode=OneWay}" 
         IsSynchronizedWithCurrentItem="True" /> 
     </ScrollViewer> 

     <DockPanel Grid.Row="0" Grid.Column="1"> 
     ... 
     </DockPanel> 

     <Expander Grid.Row="1" Grid.ColumnSpan="2"> 
      <DockPanel Height="150" HorizontalAlignment="Stretch"> 
       <TextBox DockPanel.Dock="Top" /> 
      </DockPanel> 
     </Expander> 

     <DockPanel Grid.Row="2" Grid.ColumnSpan="2"> 
     ... some buttons 
     </DockPanel> 
    </Grid> 
</Window> 

Я использовал SizeToContent, потому что я получил текстовое поле на дне, завернутые в расширитель, который будет расширенным по требованию, а на самом деле поэтому мое главное окно необходимо изменить. Это на самом деле отлично работает.

Проблема заключается в том, что высота ListView не является максимальной высотой при запуске, поэтому я получил эффект «автоматического изменения размера».

Как установить высоту ListView на максимальную высоту родителей, чтобы избежать этого эффекта?

Другая, более общая проблема. Я думаю, что избежать статических параметров компоновки (статические значения для высоты/ширины) приятно, но я понял, что теряю контроль над элементами управления пользовательского интерфейса.

Я узнал, меняя размеры моего главного окна вручную по высоте, он «прыгает» на 150 высотой DockPanel, обернутой расширителем на дне, во всяком случае, чтобы этого избежать?

Какова лучшая схема динамического интерфейса? Я исследовал DockPanel более динамично в определении размеров, чем окружающая среда, чем StackPanel. Но я думаю, это не все.

+0

Пожалуйста, постарайтесь задать один вопрос одновременно. – svick

ответ

2

Я думаю, ваш вопрос с определениями вашей сетки

<Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="2*"/> 
     <RowDefinition Height="*" /> 
     <RowDefinition Height="*" /> 
    </Grid.RowDefinitions> 

    ... 

</Grid> 

Это означает, что верхний ряд будет в два раза больше строк 2 и 3, так что верхний ряд будет принимать только до 50% ваше пространство, в то время как ваши нижние две строки занимают 25% пространства.

Если вы хотите, чтобы верхняя строка занимала все свободное пространство, убедитесь, что это единственная строка размера *, и установите остальные строки на Auto, чтобы они заняли все пространство, в котором они нуждаются.

<Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="*"/> 
     <RowDefinition Height="Auto" /> 
     <RowDefinition Height="Auto" /> 
    </Grid.RowDefinitions> 

    ... 

</Grid>