将一个面板停靠在另外两个之间

时间:2016-07-08 14:45:46

标签: c# wpf canvas

我有三个小组:

Marathon docs

第一个位于顶部,仅保留一些按钮。它将会有很多按钮。

第二个应该直接在它下面,它有一个画布应该占据窗口的大部分。

第三个是“某种”状态栏,它会保存一些标签和数据。它也只会添加很多标签。

我不想硬编码任何尺寸。所以我将第一个面板对接到父母的顶部。第二个面板(画布)也是如此。我也把它对接到顶部。第三个面板停靠在底部。

我无法使画布(第二个面板)填充第一个面板和第三个面板之间的整个空间。怎么做?

<Window x:Class="MyProject.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:MyProject"
        mc:Ignorable="d"
        Title="MainWindow" Height="700" Width="800">
    <DockPanel LastChildFill="False">
        <StackPanel DockPanel.Dock="Top">
            <GroupBox x:Name="grBoxSettings" Header="Settings" HorizontalAlignment="Stretch" VerticalAlignment="Top" Height="90" Margin="5,0,5,0">
                <WrapPanel x:Name="wrapPanelButtons" HorizontalAlignment="Left" VerticalAlignment="Top" Width="110">
                    <Button x:Name="btnTest" Content="Test" Margin="5,0,0,0" HorizontalAlignment="Center" VerticalAlignment="Top" Width="100"/>
                </WrapPanel>
            </GroupBox>
        </StackPanel>

        <Canvas HorizontalAlignment="Stretch" VerticalAlignment="Stretch" DockPanel.Dock="Top"/>

        <DockPanel LastChildFill="False" DockPanel.Dock="Bottom">
            <GroupBox Header="Version" DockPanel.Dock="Right">
                <Label x:Name="lblVersion"/>
            </GroupBox>
        </DockPanel>
    </DockPanel>
</Window>

1 个答案:

答案 0 :(得分:4)

使用GridRowDefinitions合并Height=第一名:Auto第二名:1*第三名:Auto, 或者只需在DockPanel

中切换订单
    <DockPanel LastChildFill="True">
        <StackPanel DockPanel.Dock="Top">
            <GroupBox x:Name="grBoxSettings" Header="Settings" HorizontalAlignment="Stretch" VerticalAlignment="Top" Height="90" Margin="5,0,5,0">
                <WrapPanel x:Name="wrapPanelButtons" HorizontalAlignment="Left" VerticalAlignment="Top" Width="110">
                    <Button x:Name="btnTest" Content="Test" Margin="5,0,0,0" HorizontalAlignment="Center" VerticalAlignment="Top" Width="100"/>
                </WrapPanel>
            </GroupBox>
        </StackPanel>


        <DockPanel LastChildFill="False" DockPanel.Dock="Bottom">
            <GroupBox Header="Version" DockPanel.Dock="Right">
                <Label x:Name="lblVersion"/>
            </GroupBox>
        </DockPanel>

        <Canvas HorizontalAlignment="Stretch" VerticalAlignment="Stretch" />
    </DockPanel>

另外,这里有Dock Property的一些文档:

  

如果将LastChildFill属性设置为true(默认设置),则DockPanel的最后一个子元素始终填充剩余空间,而不管您在最后一个子元素上设置的任何其他停靠值。要将子项停靠在另一个方向,必须将LastChildFill属性设置为false,并且还必须在最后一个子元素上设置显式停靠方向。