了解WPF布局
本文关键字:布局 WPF 了解 | 更新日期: 2023-09-27 18:23:49
我得到了一个ListView(封装在ScrollViewer中),如果插入的元素超过可见区域,它会调整自己的大小,直到达到父元素的最大高度。
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的高度设置为父对象高度的最大值以避免这种影响?
另一个更普遍的问题。我认为避免静态布局参数(高/宽的静态值)是很好的,但我感觉我对UI控件失去了一些控制。
我认出了,手动调整主窗口的高度,它"跳跃"了底部扩展器包裹的DockPanel的150高度,无论如何都能避免这种情况?
动态UI布局的最佳实践是什么?我探索了DockPanel比StackPanel更动态地调整大小以适应周围的扭曲。但我想这并不是全部。
我认为您的问题在于您的网格定义
<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>