了解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更动态地调整大小以适应周围的扭曲。但我想这并不是全部。

了解WPF布局

我认为您的问题在于您的网格定义

<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>