如何使 DockPanel 中的项目扩展以适应 WPF 中的所有可用空间?

Posted

技术标签:

【中文标题】如何使 DockPanel 中的项目扩展以适应 WPF 中的所有可用空间?【英文标题】:How to make items in a DockPanel expand to fit all available space in WPF? 【发布时间】:2010-11-02 07:04:01 【问题描述】:

我有一个 StackPanel 包含一个 StackPanel 和一些其他项目。第一个StackPanel 具有垂直方向,内部的具有水平方向。内部有一个TreeView 和一个ListView,我希望它们扩展并适合窗口的宽度,我通过窗口设置并允许用户更改。我还希望外部 StackPanel 适合窗口的高度。我该怎么做?

编辑: 我已经转换为使用DockPanel,并且在每个元素中正确设置了DockPanel.Dock 属性,并且在两个停靠面板中都禁用了LastChildFill,布局仍然没有拉伸。

代码:

<Window x:Class="Clippy.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="400" Width="600" MinHeight="400" MinWidth="600" Loaded="Window_Loaded" SizeChanged="Window_SizeChanged">
    <DockPanel Name="wrapperDockPanel" LastChildFill="False">
        <Menu Height="22" Name="mainMenu" Width="Auto" DockPanel.Dock="Top" />
        <ToolBar Height="26" Name="mainToolBar" Width="Auto" DockPanel.Dock="Top" />
        <DockPanel Height="Auto" Name="contentDockPanel" DockPanel.Dock="Top" LastChildFill="False">
            <TreeView Name="categoryTreeView" />
            <ListView Name="clipListView" />
        </DockPanel>
        <StatusBar Height="23" Name="mainStatusBar" DockPanel.Dock="Top" />
    </DockPanel>
</Window>

【问题讨论】:

为什么要设置 LastChildFill="False" ? True 的默认值会使 ListView 填满空间。 【参考方案1】:

改用 DockPanel。 StackPanel 明确不关心可见空间,而 DockPanel 会根据可用空间进行所有大小计算。

更新:

此外,根据我的经验,将窗口主体放入视图中,并且仅将视图放在窗口中可以提供更好的自动调整大小体验。

出于某种原因,将所有子项直接放入 Window 似乎不能很好地自动调整大小。

更新 2:

我会从要拉伸(填充)未使用空间的元素中删除显式 DockPanel.Dock 属性。

【讨论】:

【参考方案2】:

应该这样做 - 我设置它以便 TreeView 和 ListView 共享主视图 50/50;如果您不想要,请将其设置为“自动”和“*”或其他内容。充分利用“LastChildFill”!

<Window x:Class="Clippy.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="400" Width="600" MinHeight="400" MinWidth="600" Loaded="Window_Loaded" SizeChanged="Window_SizeChanged">

    <DockPanel LastChildFill="True">
        <Menu Width="Auto" DockPanel.Dock="Top" />
        <ToolBar Width="Auto" DockPanel.Dock="Top" />
        <StatusBar DockPanel.Dock="Bottom" />

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

            <TreeView Name="categoryTreeView" Grid.Row="0" />
            <ListView Name="clipListView" Grid.Row="1" />
        </Grid>
    </DockPanel>

</Window>

【讨论】:

【参考方案3】:

将宽度和高度属性设置为“自动”

【讨论】:

以上是关于如何使 DockPanel 中的项目扩展以适应 WPF 中的所有可用空间?的主要内容,如果未能解决你的问题,请参考以下文章

如何使 DockPanel 填充可用空间

使 Scrollviewer 填充 DockPanel 中的可用空间

使 HTML 元素扩展以适应内容

使图片行扩展以适应可用空间

如何使 JavaFX 窗格适应其内容的大小?

如何使 HTML 表格中的一列缩小以适应?