2012-02-07 95 views
0

我得到了一个ListView(包裹在一个ScrollViewer中),如果元素inseretd超过可见区域,它会自行调整大小,直到达到父级最大高度。了解WPF布局

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的高度设置为父母高度的最大值以避免此效应?

另一个更一般的问题。我认为避免静态布局参数(hight/width的静态值)很好,但我感觉我失去了对UI控件的一些控制。

我意识到,手动调整我的主窗口的高度,它会跳过由底部扩展器包裹的DockPanel的150个高度,无论如何要避免这种情况?

什么是动态UI布局中最好的实践?我研究了DockPanel比StackPanel更加动态地调整周围的控制。但我想这不是一切。

+0

请尝试一次提出一个问题。 – svick 2012-02-07 13:01:43

回答

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>